比赛 2025.6.2 评测结果 AAAAAAAAAA
题目名称 0-1-Tree 最终得分 100
用户昵称 徐诗畅 运行时间 0.552 s
代码语言 C++ 内存使用 13.29 MiB
提交时间 2025-06-02 11:27:30
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int cnt,head[N],n;
struct edge{
	int v,w,next;
}e[N<<1];
void addedge(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}
int bl1[N],bl2[N],tot,siz1[N],siz2[N];
void dfs(int u,int fa,int ty){
	if(ty==0) bl1[u]=tot; 
	else bl2[u]=tot;
	for(int i = head[u];i;i=e[i].next){
		int v=e[i].v;
		if(v==fa||e[i].w!=ty) continue;
		if(ty==0) siz1[tot]++;
		else siz2[tot]++;
		dfs(v,u,ty);
	}
}
signed main(){
	freopen("0-1-Tree.in","r",stdin);
	freopen("0-1-Tree.out","w",stdout);
	scanf("%lld",&n);
	for(int i = 1;i<n;i++){
		int u,v,w; scanf("%lld%lld%lld",&u,&v,&w);
		addedge(u,v,w); addedge(v,u,w);
	}
//	for(int i = 1;i<=n;i++) siz1[i]=siz2[i]=1;
	for(int i = 1;i<=n;i++){
		if(!bl1[i]){
			tot++; siz1[tot]=1;
			dfs(i,0,0);
		}
		if(!bl2[i]){
			tot++; siz2[tot]=1;
			dfs(i,0,1);
		}
	}
//	for(int i = 1;i<=tot;i++) cout<<siz1[i]<<" "<<siz2[i]<<endl;
	int ans=0;
	for(int i = 1;i<=tot;i++) ans+=siz1[i]*(siz1[i]-1)+siz2[i]*(siz2[i]-1);
	for(int i = 1;i<=n;i++) ans+=(siz1[bl1[i]]-1)*(siz2[bl2[i]]-1);
	printf("%lld",ans);
	return 0;
}