hdoj1829

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

/***************************************************************\
*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");
}
}
posted @ 2010-07-12 14:08  open source  阅读(167)  评论(0编辑  收藏  举报