#include<bits/stdc++.h> using namespace std; vector<pair<int, int>>graf[200010]; int ojciec[200010][2]; bool ktore[200010]; int ile[200010]; void dfs(int x, int o) { ojciec[x][0]=o; for(auto j: graf[x]) { if(j.first!=o) dfs(j.first, x); else ojciec[x][1]=j.second; } } bool mozna(int x, int o) { if(graf[x].size()==1 && x!=1) { if(ktore[x]==0) ile[x]=0; else ile[x]=4; //ile[x]=ktore[x]; return 1; } int xd[3]={0,0,0}; //printf("%d:: ", x); for(auto j: graf[x]) { if(j.first==o) continue; int k=j.first; if(mozna(k, x)==0) return 0; if(ile[k]!=0 && ile[k]!=1) xd[ile[k]-2]++; } if(xd[1]%2==0) { if(xd[0]==xd[2]) ile[x]=0; else { if(abs(xd[0]-xd[2])==1) { if(xd[0]>xd[2]) ile[x]=1; else ile[x]=3; } else return 0; } } else { if(xd[0]!=xd[2]) return 0; ile[x]=2; } //printf("%d-%d\n", ile[x], ktore[x]); if((ile[x]!=0 && ktore[x]==0 )) return 0; if(ile[x]==0 && ktore[x]==1) ile[x]=4; //printf("x"); return 1; } int main() { int n, a, b, z, i; scanf("%d", &n); for(i=0;i<n-1;i++) { scanf("%d%d%d", &a, &b, &z); graf[a].push_back({b,z}); graf[b].push_back({a,z}); } dfs(1, 0); long long w=0; long long p=2<<(n-1); for(long long j=1;j<p;j++) { //printf("%lld ", j); i=n; long long k=j, s=0; while(i>1) { ktore[i]=k%2; k/=2; if(ktore[i]==1) s+=ojciec[i][1]; i--; } if(s>w) { if(mozna(1,0)) { w=s; } } } printf("%lld", w); }
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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include<bits/stdc++.h> using namespace std; vector<pair<int, int>>graf[200010]; int ojciec[200010][2]; bool ktore[200010]; int ile[200010]; void dfs(int x, int o) { ojciec[x][0]=o; for(auto j: graf[x]) { if(j.first!=o) dfs(j.first, x); else ojciec[x][1]=j.second; } } bool mozna(int x, int o) { if(graf[x].size()==1 && x!=1) { if(ktore[x]==0) ile[x]=0; else ile[x]=4; //ile[x]=ktore[x]; return 1; } int xd[3]={0,0,0}; //printf("%d:: ", x); for(auto j: graf[x]) { if(j.first==o) continue; int k=j.first; if(mozna(k, x)==0) return 0; if(ile[k]!=0 && ile[k]!=1) xd[ile[k]-2]++; } if(xd[1]%2==0) { if(xd[0]==xd[2]) ile[x]=0; else { if(abs(xd[0]-xd[2])==1) { if(xd[0]>xd[2]) ile[x]=1; else ile[x]=3; } else return 0; } } else { if(xd[0]!=xd[2]) return 0; ile[x]=2; } //printf("%d-%d\n", ile[x], ktore[x]); if((ile[x]!=0 && ktore[x]==0 )) return 0; if(ile[x]==0 && ktore[x]==1) ile[x]=4; //printf("x"); return 1; } int main() { int n, a, b, z, i; scanf("%d", &n); for(i=0;i<n-1;i++) { scanf("%d%d%d", &a, &b, &z); graf[a].push_back({b,z}); graf[b].push_back({a,z}); } dfs(1, 0); long long w=0; long long p=2<<(n-1); for(long long j=1;j<p;j++) { //printf("%lld ", j); i=n; long long k=j, s=0; while(i>1) { ktore[i]=k%2; k/=2; if(ktore[i]==1) s+=ojciec[i][1]; i--; } if(s>w) { if(mozna(1,0)) { w=s; } } } printf("%lld", w); } |