数算实习 A bug's life 并查集

A bug’s life
背景
Hopper教授正在研究一种稀有物种的性行为。他假设他们有两种不同的性别,他们只与异性发生性行为。每个个体的编号都印在他们的背上。
问题
给出一个bug之间的性行为列表,确定实验是否支持他的假设:该物种之间不存在同性恋关系。

输入
输入的第一行包含实验的数量。每个实验的第一行给出了bug数(至少一个,最多2000个)和性行为数(最多1000000)。在以下数行中,每行给出发生性行为的两只bug的编号。bug从1开始连续编号。
输出
每个场景的输出都是一行包含“Scenario #i:”,其中i是从1开始的实验编号。如果实验与他对bug的性行为的假设一致,则输出“No suspicious bugs found!” 。 如果Hopper教授的假设是绝对错误的,则输出“Suspicious bugs found!”。

样例输入
2
3 3
1 2
2 3
1 3
4 2
1 2
3 4
样例输出
Scenario #1:
Suspicious bugs found!

Scenario #2:
No suspicious bugs found!

  #include  <iostream> 
  using  namespace std ; 
  // 1表示有关系0表示无关
 
  const  int MAX = 2000 ; 
  int parent [ MAX +10 ]; 
  int relation [ MAX +10 ]; 
  int t ; 
  int n , k ;
  
  int Getroot(int a)
  {
  	if(a==parent[a])
	  {
  		return a;
	  }
    int t=parent[a];
  	parent[a]=Getroot(parent[a]);
  	relation[a]=(relation[a]+relation[t])%2;
  	return parent[a];
  } 
  
   void merge(int a,int b)
  {
  		int pa=Getroot(a);
	  	int pb=Getroot(b);                    //压缩 
	  	parent[pa]=pb;
	  	if(relation[a]+relation[b]!=1)
	  	  relation[pa]=1;
	  	else
	  	  relation[pa]=0;
  } 
   
   int main()
  {
  	cin>>t;
    for(int j=1;j<=t;j++)
	{
	  scanf("%d%d",&n,&k);
	  for (int i=1;i<=n;i++)
	  {
		parent[i]=i;
		relation[i]=0;
      }
	  int flag=0;
	  for (int i=1;i<=k;i++)
	  {
	  	int a,b;          //编号 
	  	scanf("%d%d",&a,&b);
	  	int pa=Getroot(a);
	  	int pb=Getroot(b);                    //压缩 
	  	if(pa!=pb)
		  {
	  		merge(a,b); 
		  }
	  	else
		  {
	  		if(relation[a]==relation[b]) 
			  {
			    flag=1;
			    continue;
			  }
		  }
	  }	
  		if(flag==0)
  		cout<<"Scenario #"<<j<<":"<<endl<<"No suspicious bugs found!"<<endl<<endl;
  		else
  		cout<<"Scenario #"<<j<<":"<<endl<<"Suspicious bugs found!"<<endl<<endl;
  	}
  	return 0;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值