给你n个虫子,m个虫子相恋的关系,问有没有同性虫子相恋。
#include<stdio.h>
using namespace std;
#define MAXN 2005
int n,m;
int pre[MAXN];
int type[MAXN];
void init(){
for(int i=1;i<=n;i++){
pre[i]=i;
type[i]=0;//0为同类1为异类
}
}
int find(int x){
if(x==pre[x])
return x;
int px=find(pre[x]);
type[x]=(type[x]+type[pre[x]])%2;
return pre[x]=px;
}
int Union(int x,int y)
{
int a=find(x),b=find(y);
if(a==b) //根节点相同,判断与根节点的关系是否相同
{
if(type[x]==type[y])
return 1;;
return 0;
}
pre[b]=a;
type[b]=(type[x]-type[y]+1+2)%2; //根节点不同,并查集合并,并且更改根节点之间的关系
return 0;
}
int main(){
int t,KASE=1;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
init();
int ans=0;
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(Union(a,b))
ans=1;
}
printf("Scenario #%d:\n",KASE++);
if(ans==1)
printf("Suspicious bugs found!\n");
else printf("No suspicious bugs found!\n");
puts("");
}
return 0;
}
给你n个虫子,m个虫子相恋的关系,问有没有同性虫子相恋。
#include<stdio.h>
using namespace std;
#define MAXN 2005
int n,m;
int pre[MAXN];
int type[MAXN];
void init(){
for(int i=1;i<=n;i++){
pre[i]=i;
type[i]=0;//0为同类1为异类
}
}
int find(int x){
if(x==pre[x])
return x;
int px=find(pre[x]);
type[x]=(type[x]+type[pre[x]])%2;
return pre[x]=px;
}
int Union(int x,int y)
{
int a=find(x),b=find(y);
if(a==b) //根节点相同,判断与根节点的关系是否相同
{
if(type[x]==type[y])
return 1;;
return 0;
}
pre[b]=a;
type[b]=(type[x]-type[y]+1+2)%2; //根节点不同,并查集合并,并且更改根节点之间的关系
return 0;
}
int main(){
int t,KASE=1;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
init();
int ans=0;
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(Union(a,b))
ans=1;
}
printf("Scenario #%d:\n",KASE++);
if(ans==1)
printf("Suspicious bugs found!\n");
else printf("No suspicious bugs found!\n");
puts("");
}
return 0;
}