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;
}
View Code

第二个就是带权并查集,博客多的是,查一下就好

posted @ 2016-07-27 11:12  N维解析几何  阅读(114)  评论(0编辑  收藏  举报