求助
查看原帖
求助
287395
abc_de楼主2022/8/31 21:21

为什么有的测试点会没有输出,非常的疑惑,求求dalao解答。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int con=1e5+1;
int n,m,k;
int x[maxn],y[maxn],c[maxn];
long long ans=0;
int f[maxn*2];
struct node{
	int p,w;	
}e[maxn*2];
int rd(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();	
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();	
	}
	return x*f;
}
int find(int x){
	if(e[x].p==x) return x;
	int t=find(e[x].p);
	e[x].w^=e[e[x].p].w;
	return e[x].p=t;
}
int main(){
	n=rd();m=rd();k=rd();
	con=n;
	int po=-1;
	for(int i=1;i<=k;i++){
		x[i]=rd();y[i]=rd();c[i]=rd();
		if(x[i]==1&&y[i]==1) po=c[i];
		y[i]+=con;
	}
	int flag=0;
	if(po!=1){
	for(int i=1;i<=n+m;i++) e[i].p=i,e[i].w=0;
	e[n+1].p=1;
	for(int i=1;i<=k;i++){//c[1][1]=0
		if(x[i]==1&&y[i]==1) continue;
		int o=(x[i]-1)*(y[i]-con-1);
		int d;
		int fx=find(x[i]),fy=find(y[i]);
		if(o%2==1) d=(c[i]+1)%2;
		if(o%2==0) d=c[i];
		if(fx!=fy){
			e[fx].p=y[i];
			int x1=e[x[i]].w^e[y[i]].w;
			e[fx].w=1;
			if(x1^1!=d) e[fx].w=0;
		}
		else{
			if(e[x[i]].w^e[y[i]].w!=d){
				flag=1;
				break;
			}
		}
	}
	if(flag==0){
		int sum=0;
		for(int i=1;i<=n+m;i++) if(find(i)==i) sum++;
		ans+=pow(2,sum-1);
		ans%=1000000000;
	}
	}
	
	
	if(po!=0){
	for(int i=1;i<=n+m;i++) e[i].p=i,e[i].w=0;
	e[n+1].p=1;
	int flag=0;
	for(int i=1;i<=k;i++){//c[1][1]=1
		if(x[i]==1&&y[i]==1) continue;
		int fx=find(x[i]),fy=find(y[i]);
		int o=(x[i]-1)*(y[i]-con-1);
		int d;
		if(o%2==1) d=c[i];
		if(o%2==0) d=(c[i]+1)%2;
		if(fx!=fy){
			e[fx].p=y[i];
			int x1=e[x[i]].w^e[y[i]].w;
			e[fx].w=1;
			if(x1^1!=d) e[fx].w=0;
		}
		else{
			if(e[x[i]].w^e[y[i]].w!=d){
				flag=1;
				break;
			}
		}
	}	
	if(flag==0){
		int sum=0;
		for(int i=1;i<=n+m;i++) if(find(i)==i) sum++;
		ans+=pow(2,sum-1);
	}
	}
	cout<<ans%1000000000;
	return 0;
}
2022/8/31 21:21
加载中...