//可能的路;全0,全1,前一段0,后一段1
//对于只有0边存在的一个连通量,贡献为sz0*(sz0-1)
//对于只有1边存在的一个连通量,贡献为sz0*(sz0-1)
//前一半为0,后一半为1时,为(u,t) ,(t,v)的形式
//枚举分界点t,他的贡献就与他所在的0连通分量及1连通分量大小有关:(sz0-1) * (sz1-1)
int f[2][MAXN],sz[2][MAXN];
int find(int k,int x){return f[k][x]==x?x:f[k][x] = find(k,f[k][x]);}
signed main()
{
int n;cin>>n;
rpp(i,n) f[0][i]=f[1][i]=i,sz[0][i]=sz[1][i]=1;
rep(i,n-1)
{
int x,y,k;cin>>x>>y>>k;
int fx = find(k,x) , fy = find(k,y);
if(fx!=fy)
{
f[k][fy] = f[k][fx];
sz[k][fx] +=sz[k][fy];
}
}
ll ans = 0;
rpp(i,n)
{
if(find(0,i)==i) ans+=1ll*sz[0][i]*(sz[0][i] - 1);
if(find(1,i)==i) ans+=1ll*sz[1][i]*(sz[1][i] - 1);
ans += 1ll*(sz[0][find(0,i)]-1)*(sz[1][find(1,i)]-1);
}
cout<<ans<<endl;
return 0;
}
Educational Codeforces Round 64 (Rated for Div. 2) D - 0-1-Tree (并查集,方案数)
最新推荐文章于 2022-05-16 20:48:24 发布