当前位置: 代码迷 >> 综合 >> 并查集的扩展 poj 2492
  详细解决方案

并查集的扩展 poj 2492

热度:24   发布时间:2023-11-18 03:47:20.0

题目链接  点击打开链接

这道题类似于poj 的 1703

直接上代码

#include<iostream>
#include<stdio.h>
using namespace std;
int father[2010];
int mark[2010];
int t,m,n;
int x,y;
bool flag;
int find(int x)
{if(x!=father[x]){int t=father[x];father[x]=find(father[x]);mark[x]=(mark[x]+mark[t])%2;}return father[x];
}
void join(int x,int y)
{int xx=find(x);int yy=find(y);if(xx!=yy){father[xx]=yy;mark[xx]=(mark[y]+mark[x]+1)%2;}
}
int main()
{scanf("%d",&t);for(int l=1;l<=t;l++){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){father[i]=i;mark[i]=0;}flag=true;while(m--){scanf("%d%d",&x,&y);if(flag){join(x,y);  //如果没有同性恋的话就两个虫合并}if(father[x]==father[y]) {if(mark[x]==mark[y]) //如果两个节点的根节点相同且他们的mark值相同则说明他们是同性恋flag=false;}}printf("Scenario #%d:\n",l);if(flag)printf("No suspicious bugs found!\n");elseprintf("Suspicious bugs found!\n");printf("\n");}return 0;
}