習題:Love Triangles(冰茶姬)
阿新 • • 發佈:2020-08-24
題目
思路
如果圖連起來是一個二分圖,那麼二分圖的每一個邊權是確定的
考慮二分圖和二分圖之間的邊,也就是跨二分圖的三元組,很明顯,其也是確定的
也就是最終的答案就是\(2^{cnt-1}\),cnt表示二分圖的數量
關於二分圖的統計用一個冰茶姬來統計即可
程式碼
#include<iostream> #include<cstdio> #include<vector> using namespace std; namespace ufs { int w[100005]; int fa[100005]; void makeset(int n) { for(int i=1;i<=n;i++) fa[i]=i; } int findset(int x) { if(fa[x]==x) return x; int t=findset(fa[x]); w[x]^=w[fa[x]]; return fa[x]=t; } void merge(int u,int v,int type) { int a=findset(u); int b=findset(v); if(a==b) return; fa[a]=b; w[a]=type^w[u]^w[v]; w[b]=0; } } using namespace ufs; const int mod=1e9+7; int n,m; int cnt=0; long long qkpow(int a,int b) { if(b==0) return 1; if(b==1) return a; long long t=qkpow(a,b/2); t=t*t%mod; if(b%2==1) t=t*a%mod; return t; } int main() { cin>>n>>m; makeset(n); cnt=n; for(int i=1,u,v,t;i<=m;i++) { cin>>u>>v>>t; t=t^1; if(findset(u)==findset(v)) { if((w[u]^w[v])!=t) { cout<<"0"; return 0; } } else { cnt--; merge(u,v,t); } } cout<<qkpow(2,cnt-1); return 0; }