1. 程式人生 > 實用技巧 >習題:Love Triangles(冰茶姬)

習題:Love Triangles(冰茶姬)

題目

傳送門

思路

如果圖連起來是一個二分圖,那麼二分圖的每一個邊權是確定的

考慮二分圖和二分圖之間的邊,也就是跨二分圖的三元組,很明顯,其也是確定的

也就是最終的答案就是\(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;
}