比赛 |
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;
}