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
| #include<bits/stdc++.h> using namespace std; struct edg{ int nxt,y,v; }e[210000]; int lk[110000],lt; int et[110000][2]; void ist(int x,int y,int z){ e[++lt]=(edg){lk[x],y,z}; lk[x]=lt; e[++lt]=(edg){lk[y],x,z}; lk[y]=lt; et[x][z]++; et[y][z]++; } int n; long long a[110000]; int dp[110000]; long long bow; long long ans; long long ccl(int x,int y){ y^=1; if(et[x][y]==0 && et[x][y^1]>1){ return a[x]*dp[x]; } if(et[x][y]==1 && et[x][y^1]>0){ return -a[x]*dp[x]; } return 0; } void dfs(int x,int y,int z){ dp[x]=z; for(int i=lk[x];i;i=e[i].nxt){ if(e[i].y==y){ continue; } dfs(e[i].y,x,z+1); ans=max(ans,ccl(x,e[i].v)+ccl(e[i].y,e[i].v)); } if(et[x][0] && et[x][1]){ bow+=a[x]*2*dp[x]; } else{ bow+=a[x]*dp[x]; } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } int l,r,v; for(int i=1;i<n;i++){ scanf("%d%d%d",&l,&r,&v); ist(l,r,v); } dfs(1,0,1); printf("%lld\n",bow+ans); return 0; }
|