比赛 2025.6.2 评测结果 AAAAAAAAAA
题目名称 0-1-Tree 最终得分 100
用户昵称 会挽弯弓满月 运行时间 1.256 s
代码语言 C++ 内存使用 43.54 MiB
提交时间 2025-06-02 11:27:22
显示代码纯文本
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=2e5+10;
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<48||c>57){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>=48&&c<=57){
		x=x*10+c-48;
		c=getchar();
	}
	return f*x;
}
vector<int> a[2*N],c[2*N],z0[N],z1[N];
int s[N][3];
int tot;
void dfs(int u,int fa,int d){
	if(d==0) z0[tot].pb(u);
	else z1[tot].pb(u);
	s[u][d]=tot;
	int v,dd;
	for(int i=0;i<a[u].size();i++){
		v=a[u][i];
		dd=c[u][i];
		if(v==fa||d!=dd) continue;
		dfs(v,u,d);
	}
	return;
}
int n,u,v,w;
long long ans;
int len0,len1;
int main(){
	freopen("0-1-Tree.in","r",stdin);
	freopen("0-1-Tree.out","w",stdout);
	n=read();
	for(int i=1;i<n;i++){
		u=read();v=read();w=read();
		a[u].pb(v);c[u].pb(w);
		a[v].pb(u);c[v].pb(w);
	}
	for(int i=1;i<=n;i++){
		if(s[i][0]==0){
			tot++;
			dfs(i,0,0);
		}
		if(s[i][1]==0){
			tot++;
			dfs(i,0,1);
		}
	}
	for(int i=1;i<=tot;i++){
		len0=z0[i].size();
		len1=z1[i].size();
		ans+=1ll*len0*(len0-1)+1ll*len1*(len1-1);
	}
	for(int i=1;i<=n;i++){
		len0=z0[s[i][0]].size();
		len1=z1[s[i][1]].size();
		ans+=1ll*(len0-1)*(len1-1);
	}
	printf("%lld",ans);
	return 0;
}