rt,照着第6篇题解改的,真的找不出来问题了求捞捞QAQ!
#include<iostream>
#define int long long
using namespace std;
const int N=1e6,mod=1e9;
int n,m,k,X[N],Y[N],A[N],tag[2];
int ans,fas[N<<1],len[N<<1];
int qmi(int x,int y){
if(y<0) return 0;
int base=x,an=1;
while(y){
if(y&1) an=an*base%mod;
base=base*base%mod,y>>=1;
}
return an;
}
int Find(int x){
if(x!=fas[x]){
int fa=Find(fas[x]);
len[x]^=len[fas[x]];
fas[x]=fa;
}
return fas[x];
}
int solve(int w,int siz=n+m){
for(int i=1;i<=n+m;i++) fas[i]=i,len[i]=0;
fas[1]=fas[1+n];siz--;
for(int i=1;i<=k;i++){
int x=X[i],y=Y[i]+n,a=(A[i]^w);
if(X[i]%2==0&&Y[i]%2==0) a^=1;
int fx=Find(x),fy=Find(y);
if(fx!=fy){
fas[fx]=fy;siz--;
len[fx]^=len[x]^len[y]^a;
}
else if((len[x]^len[y])!=a) return 0;
}
return qmi(2,siz-1);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=k;i++){
cin>>X[i]>>Y[i]>>A[i];
if(X[i]==1&&Y[i]==1) tag[A[i]]=1,i--,k--;
}
if(!tag[0]) ans=(ans+solve(0))%mod;
if(!tag[1]) ans=(ans+solve(1))%mod;
cout<<ans;
return 0;
}