poj 2492 并查集 A Bug's Life

本文介绍了一种使用并查集算法解决虫群间关系冲突检测的问题。通过为每只虫创建独立的对象,并利用并查集的数据结构进行对象间的连接与冲突判断,确保虫群关系的一致性和合法性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题可以用disset数组来装每个虫的对象,并把对象合并到一起,
然后看看如果偶有一组的数根相等,那么就是有问题了

#include<iostream>
using namespace std;
#define max 2010
int pa[max];
int rank[max];
int disset[max];
void make_set(int x)
{
 pa[x]=x;
 rank[x]=0;
 disset[x]=-1;
 return ;
}
int find_set(int x)
{
 if(x!=pa[x])
 pa[x]=find_set(pa[x]);
 return pa[x];
}
void union_set(int x,int y)
{
 x=find_set(x);
 y=find_set(y);
 if(x==y) return ;
 if(rank[x]>rank[y])
 pa[y]=x;
 else
 {
  pa[x]=y;
  if(rank[x]==rank[y])
  rank[y]++;
 }
 return ;
}
int main()
{
 int p=1;
 int cases;
 bool flag;
 int x,y;
 cin>>cases;
 while(cases--)
 {
  int bug;
  long pair;
  scanf("%d%ld",&bug,&pair);
  for(int i=0;i<=bug;i++)//初始化赋值让我给整错了
  make_set(i);
  flag=false;
  while(pair--)
  {
   scanf("%d%d",&x,&y);
   if(flag)
   continue;
   
   if(find_set(x)==find_set(y))
   flag=true;
   else
   {
    if(disset[x]!=-1)
    {
     union_set(disset[x],y);
    }
    else
    disset[x]=y;//这个过程中只要状对象就行,矛盾在于对象
    if(disset[y]!=-1)
    {
     union_set(x,disset[y]);
    }
    else
    disset[y]=x;
   }
 //  union_set(x,y);
  }
  printf("Scenario #%d:/n",p++);
  if(flag)
  printf("Suspicious bugs found!/n/n");
  else
  printf("No suspicious bugs found!/n/n");
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码随想录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值