WA on #14求调
查看原帖
WA on #14求调
763878
Jerry_heng楼主2024/7/9 20:55

这和第一篇题解有什么区别?

#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;
}
2024/7/9 20:55
加载中...