POJ 2492 A Bug's Life

来源:互联网 发布:linux find mtime 1 编辑:程序博客网 时间:2024/05/21 07:01

并查集操作,用一个oid数组来存放虫子的对立面

如果两只虫子a,b的祖先相同那就是同性恋了.

每次合并a,b把a和b的对立面合并,把b和a的对立面合并

#include <iostream>#include <cstdio>using namespace std;const int maxn=2010;int id[maxn],oid[maxn],size[maxn],n,m;void clear(){for (int i=1;i<=n;++i){id[i]=i;oid[i]=0;size[i]=1;}}int find(int p){return p==id[p]?p:id[p]=find(id[p]);}void uni(int p,int q){int pp=find(p),pq=find(q);if(pp==pq)return;if(size[pp]>size[pq]){id[pq]=pp;size[pp]+=size[pq];}else{id[pp]=pq;size[pq]+=size[pp];}}int main(){int t,cas=1;scanf("%d",&t);while (t--){scanf("%d%d",&n,&m);printf("Scenario #%d:\n",cas++);clear();bool f=0;while (m--){int p,q,pp,pq;scanf("%d%d",&p,&q);if(f)continue;pp=find(p),pq=find(q);if(pp==pq){//祖先相同,有同性恋....f=1;continue;}else{if(oid[p]==0){oid[p]=pq;}if(oid[q]==0){oid[q]=pp;}uni(p,oid[pq]);//和对方的对立面合并uni(q,oid[pp]);}}if(!f){printf("No suspicious bugs found!\n\n");}else{printf("Suspicious bugs found!\n\n");}}return 0;}