hdu 2492 A Bug's Life
题意: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; }
第二个就是带权并查集,博客多的是,查一下就好