Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=1e5+7;
- int root,SIZE;
- int siz[N];
- int s[N];
- int ecnt;
- int fir[N],nex[N<<1],to[N<<1],w[N<<1];
- inline void addedge(int u,int v,int c){
- nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
- nex[++ecnt]=fir[v],fir[v]=ecnt,to[ecnt]=u,w[ecnt]=c;
- }
- bool vis[N];
- void getroot(int x,int f){
- siz[x]=1;
- s[x]=0;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(v==f||vis[v])continue;
- getroot(v,x);
- siz[x]+=siz[v];
- s[x]=max(s[x],siz[v]);
- }
- s[x]=max(s[x],SIZE-siz[x]);
- if(s[x]<s[root])root=x;
- }
- ll ans;
- int pool[N*10];
- int *F[2]={pool+N*1,pool+N*3};
- int *G[2]={pool+N*5,pool+N*7};
- int *cnt=pool+N*9;
- int dis[N];
- int maxdep;
- void getdist(int x,int f,int dep){
- maxdep=max(maxdep,dep);
- F[bool(cnt[dis[x]])][dis[x]]++;
- cnt[dis[x]]++;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(v==f||vis[v])continue;
- dis[v]=dis[x]+w[i];
- getdist(v,x,dep+1);
- }
- cnt[dis[x]]--;
- }
- void solve(int x){
- vis[x]=1;
- int mx=0;
- G[0][0]=1;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(vis[v])continue;
- dis[v]=w[i];
- maxdep=0;
- getdist(v,0,1);
- ans+=(ll)(G[0][0]-1)*F[0][0];
- for(int i=-maxdep;i<=maxdep;++i){
- ans+=(ll)G[0][i]*F[1][-i];
- ans+=(ll)G[1][i]*F[0][-i];
- ans+=(ll)G[1][i]*F[1][-i];
- }
- for(int i=-maxdep;i<=maxdep;++i){
- G[0][i]+=F[0][i];
- G[1][i]+=F[1][i];
- F[0][i]=F[1][i]=0;
- }
- mx=max(mx,maxdep);
- }
- for(int i=-mx;i<=mx;++i){
- G[0][i]=G[1][i]=0;
- }
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(vis[v])continue;
- s[root=0]=SIZE=siz[v];
- getroot(v,0);
- solve(root);
- }
- }
- int main(){
- // freopen(".in","r",stdin);
- // freopen(".out","w",stdout);
- int n;r(n);
- for(int i=1;i<n;++i){
- int u,v,c;
- r(u),r(v),r(c);
- addedge(u,v,c?1:-1);
- }
- s[root=0]=SIZE=n;
- getroot(1,0);
- solve(root);
- printf("%lld\n",ans);
- return 0;
- }
- /*
- 7
- 1 2 0
- 3 1 1
- 2 4 0
- 5 2 0
- 6 3 1
- 5 7 1
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement