Problem : 1829 ( A Bug's Life ) Judge Status : Accepted
RunId : 2591180 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
RunId : 2591180 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author: 小呼
*Created Time: Mon 12 Jul 2010 10:13:14 AM CST
*File Name: main.cpp
*Description:并查集问题。可以分配一个数组interaction,用来记录跟
*每个bug交配过的bug,数组初始化为-1。如果有事件A与B交配,则B与
*interaction[A]同性(前提是interaction[A]>0),同样,A也与
*interaction[B]同性,将它们所在的集合合并,如果发现A,B在相同的集合
*里,那么教授的猜想就是错的。
\***************************************************************/
//*========================*Head File*========================*\\
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*----------------------*Global Variable*----------------------*/
int interaction[1000001],parent[1000001];//interaction表示第一个
//之交配的bug
int M,N,T,A,B;//N是bug数目,M是交配事件数目,T是case数
bool flag;//用来标记教授的猜想是否正确
//*=======================*Main Program*=======================*//
using namespace std;
int find(int x){
if(parent[x]>0)
parent[x]=find(parent[x]);
return parent[x]>0?parent[x]:x;
}
void union_set(int x,int y){
x=find(x);y=find(y);
if(x==y)
return;
if(parent[x]<parent[y]){
parent[x]+=parent[y];
parent[y]=x;
}
else{
parent[y]+=parent[x];
parent[x]=y;
}
}
int main(){
//freopen("input","r",stdin);
scanf("%d",&T);
for(int i=1;i<=T;++i){
memset(parent,-1,sizeof(parent));
memset(interaction,-1,sizeof(interaction));
flag=0;
scanf("%d%d",&N,&M);
while(M--){
scanf("%d%d",&A,&B);
if(flag||find(A)==find(B)){//如果已经发现猜想错误或者A,B同性,刚猜想错误
flag=1;
continue;
}
if(interaction[A]>0)
union_set(interaction[A],B);
else
interaction[A]=B;
if(interaction[B]>0)
union_set(interaction[B],A);
else
interaction[B]=A;
}
printf("Scenario #%d:\n",i);
if(flag)
printf("Suspicious bugs found!\n\n");//注意格式
else
printf("No suspicious bugs found!\n\n");
}
}