这和第一篇题解有什么区别?
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int mxn=2e5+10;
struct node{
int to,nxt,val;
}edge[mxn<<1];
int tot,head[mxn],ans,cnt,s[mxn][2];
vector<int>s0[mxn<<1],s1[mxn<<1];
void add(int u,int v,int w){
edge[++cnt]=(node){v,head[u],w};
head[u]=cnt;
}
void dfs(int u,int f,int col){
if(!col)s0[tot].pb(u);
else s1[tot].pb(u);
s[u][col]=tot;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==f||col!=edge[i].val)continue;
dfs(v,u,col);
}
}
signed main(){
int n=read();
for(int i=1;i<n;i++){
int u=read(),v=read(),col=read();
add(u,v,col),add(v,u,col);
}
for(int i=1;i<=n;i++){
if(!s[i][0]){
++tot;
dfs(i,0,0);
ans+=(s0[tot].size()-1)*s0[tot].size();
}
if(!s[i][1]){
++tot;
dfs(i,0,1);
ans+=(s1[tot].size()-1)*s1[tot].size();
}
}
for(int i=1;i<=n;i++){
ans+=(s0[s[i][0]].size()-1)*(s1[s[i][1]].size()-1);
}
printf("%lld\n",ans);
return 0;
}