/*
zoj2740并查集简单应用
【题目大意】
信息系统:
1.由许多端点组成,端点是由信息通道连接。
2.每个端点都可以收发信息。
3.收发信息时,每个端点将处理信息,再发送信息给与之连接的端点(除了发送信息给它的那个端点)。
4.每个端点不能接受重复的信息。
分析:
1.所有端点在同一图中
2.图不能有环
*/
#include <stdio.h>
#include <string.h>
#define NUM 1001
int set[NUM];
struct pt
{
int x,y;
}P[100010];
int k;
int min(int a,int b){return a>b?b:a;}
int max(int a,int b){return a>b?a:b;}
int find(int x)
{
int r=x,i,j;
while(r!=set[r])
r=set[r];
return r;
}
int join(int a,int b)
{
int af=find(a);
int bf=find(b);
set[af]=bf;
if(af!=bf)
return 1;
else
{
int x=min(a,b);
int y=max(a,b);
for(int i=0;i<k;i++)
if(x==P[i].x && y==P[i].y)
return 1;
return 0;//成环
}
}
int main()
{
int n,m;
int i,a,b;
while(scanf("%d%d",&n,&m)!=EOF && !(n==0 && m==0))
{
int flag=1;
for(i=0;i<=n;i++)
set[i]=i;
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
int t=join(a,b);
P[k].x=min(a,b);
P[k++].y=max(a,b);
if(!t)flag=0;
}
int x=1;
while(x!=set[x])
x=set[x];
for(i=2;i<=n;i++)
{
int y=i;
while(y!=set[y])
y=set[y];
if(x!=y)
{
flag=0;//判断所有端点是否在同一图中
break;
}
}
if(!flag)printf("No\n");
else printf("Yes\n");
}
return 0;
}
zoj2740-简单并查集
最新推荐文章于 2022-04-11 19:34:57 发布