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