Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <iostream> #include <vector> using namespace std; long long waga[307]; vector<int> tab[307]; long long suma[307]; //suma wag w poddrzewie long long s; //suma pozosta�ych long long ile; //na ile mamy podzieli� pozosta�e long long wynik; void dfs(int v, int ojc) { suma[v] = waga[v]; for (int i = 0; i < tab[v].size(); i++) { if (tab[v][i] != ojc) { dfs(tab[v][i], v); if ((suma[v] + suma[tab[v][i]]) * ile > s && ile > 1) { wynik += suma[tab[v][i]] * suma[tab[v][i]]; s -= suma[tab[v][i]]; ile--; } else { suma[v] += suma[tab[v][i]]; } } } if (ojc == 0) { wynik += suma[v] * suma[v]; //odcieli�my ile mogli�my //cout<<"na koniec ile = "<<ile<<", wynik = "<<wynik<<endl; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin>>t; for (int l = 0; l < t; l++) { int n; cin>>n; long long suma_wag = 0; for (int i = 1; i <= n; i++) { cin>>waga[i]; tab[i].clear(); suma_wag += waga[i]; } for (int i = 1; i < n; i++) { int a, b; cin>>a>>b; tab[a].push_back(b); tab[b].push_back(a); } for (int i = 1; i <= n; i++) { //dzielimy na i cz�ci long long najlepszy = 90000000000000007; //minimalny wynik dla podzia�u na i cz�ci for (int j = 1; j <= n; j++) { //puszczamy dfs z wierzcho�ka j s = suma_wag; ile = i; wynik = 0; //cout<<"puszczam dfs z "<<j<<" "; dfs(j, 0); najlepszy = min(najlepszy, wynik); } cout<<najlepszy<<" "; } cout<<"\n"; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <iostream> #include <vector> using namespace std; long long waga[307]; vector<int> tab[307]; long long suma[307]; //suma wag w poddrzewie long long s; //suma pozosta�ych long long ile; //na ile mamy podzieli� pozosta�e long long wynik; void dfs(int v, int ojc) { suma[v] = waga[v]; for (int i = 0; i < tab[v].size(); i++) { if (tab[v][i] != ojc) { dfs(tab[v][i], v); if ((suma[v] + suma[tab[v][i]]) * ile > s && ile > 1) { wynik += suma[tab[v][i]] * suma[tab[v][i]]; s -= suma[tab[v][i]]; ile--; } else { suma[v] += suma[tab[v][i]]; } } } if (ojc == 0) { wynik += suma[v] * suma[v]; //odcieli�my ile mogli�my //cout<<"na koniec ile = "<<ile<<", wynik = "<<wynik<<endl; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin>>t; for (int l = 0; l < t; l++) { int n; cin>>n; long long suma_wag = 0; for (int i = 1; i <= n; i++) { cin>>waga[i]; tab[i].clear(); suma_wag += waga[i]; } for (int i = 1; i < n; i++) { int a, b; cin>>a>>b; tab[a].push_back(b); tab[b].push_back(a); } for (int i = 1; i <= n; i++) { //dzielimy na i cz�ci long long najlepszy = 90000000000000007; //minimalny wynik dla podzia�u na i cz�ci for (int j = 1; j <= n; j++) { //puszczamy dfs z wierzcho�ka j s = suma_wag; ile = i; wynik = 0; //cout<<"puszczam dfs z "<<j<<" "; dfs(j, 0); najlepszy = min(najlepszy, wynik); } cout<<najlepszy<<" "; } cout<<"\n"; } } |