题目链接:点击
这题主要体现了:树的判环和不连续结点。
#include<stdio.h>
const int N=100005;
int father[N];
bool flag1=true,flag2=false,mark[N];
void Init()
{
for(int i=0;i<=N;i++)
{father[i]=i;mark[i]=0;}
}
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void Union(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b) father[a]=b;
else flag1=false;//如果根结点相同,说明在一个集合中,如果在合并,一定成环.
}
//该题要注意的是,可能节点,不是连续的.
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)&&(a!=-1&&b!=-1))
{
if(!a&&!b) {printf("Yes\n");continue;}
Init();
mark[a]=true;mark[b]=true;
Union(a,b);
int f;
while(scanf("%d%d",&a,&b)&&(a+b))
{mark[a]=true;mark[b]=true;f=find(b);Union(a,b);}
int what=0,whatfuck=0;
for(int i=1;i<N;i++)
{
if(mark[i]) what++;
if(find(i)==f) whatfuck++;
}
// printf("(%d %d)\n",what,whatfuck);
if(flag1&&(what==whatfuck))
printf("Yes\n");
else printf("No\n");
}
}
本题与Nyoj129(
点击打开链接)有所区别,Nyoj的是有向边。而该题是无向边。