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
| #include<bits/stdc++.h> #define REG register using namespace std; inline void read(int& x){ static char c; while(!isdigit(c=getchar()));x=c^48; while(isdigit(c=getchar()))x=(x*10)+(c^48); }
const int M=200005;
int n,A[M],B[M],C[M],S1,S2;
int MA[M],SB[M],SC[M];
long long ans;
struct Edge{int v,nxt;}ed[M<<1]; int head[M],cnt; inline void adde(int u,int v){ed[++cnt]=(Edge){v,head[u]},head[u]=cnt;} inline void add(int u,int v){adde(u,v),adde(v,u);} #define FORE(i,Now) for(REG int i=head[Now];i;i=ed[i].nxt)
void dfs(int Now,int Fa){ MA[Now]=min(MA[Fa],A[Now]); FORE(i,Now){ int v=ed[i].v; if(v==Fa) continue; dfs(v,Now); SB[Now]+=SB[v],SC[Now]+=SC[v]; } SB[Now]+=(B[Now]^C[Now])&B[Now],SC[Now]+=(B[Now]^C[Now])&(!B[Now]); if(A[Now]>MA[Fa]) return; ans+=2ll*A[Now]*min(SB[Now],SC[Now]); SB[Now]-=min(SB[Now],SC[Now]),SC[Now]-=min(SB[Now],SC[Now]); }
int u,v;
inline void Work(){ read(n),MA[1]=1000000005; for(REG int i=1;i<=n;++i) read(A[i]),read(B[i]),read(C[i]); for(REG int i=1;i<=n;++i) if(B[i]^C[i]) B[i]?++S1:++S2; if(S1^S2){puts("-1");return;} for(REG int i=1;i<n;++i) read(u),read(v),add(u,v); dfs(1,1); printf("%lld\n",ans); }
int main(){Work();}
|