#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); } |
English