习题: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;
}

浙公网安备 33010602011771号