您的位置:首页 > Web前端

hdu 2492 A Bug's Life

2016-07-27 11:12 148 查看
题意:n只虫子,有两种性别,给出m次交配情况(正常是异性),问是否会出现同性交配的情况

分析:两种方法解决 ,第一眼看到这道题,就是二分图染色,bfs一下,有没有解救Ok了,确实个并查集题,尴尬

2-SAT解法,把一个点拆成两个点,是和非 ,a b为异的话,那么a和b非 ,a非和b,x表示是,x+n表示否成立,只要每个集合不冲突,也就是a和b不出现在一个集合里面,那么就有解,每次判断是否冲突,冲突就无解,否则就把(a,b+n),(a+n,b)合并

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int f[maxn],v[maxn];

void init(int n){
for(int i=0;i<=n;i++)
f[i]=i,v[i]=0;
}

int find(int x){
return x==f[x]?x:f[x]=find(f[x]);
}

void bing(int x,int y){
int t1=find(x);
int t2=find(y);
if(t1!=t2)
f[t2]=t1;
}

int main(){
int t,cas=1,n,m,x,y;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
init(n*2);
bool ans=1;
while(m--){
scanf("%d%d",&x,&y);
if(!ans)continue;
int t1=find(x);
int t2=find(y);
if(t1==t2)ans=0;
bing(x,y+n);
bing(x+n,y);

}
printf("Scenario #%d:\n",cas++);
if(ans)
puts("No suspicious bugs found!");
else
puts("Suspicious bugs found!");
puts("");
}
return 0;
}


View Code
第二个就是带权并查集,博客多的是,查一下就好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: