題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
題目解析:判斷圖是否聯通和是否有迴路,並查集處理,判斷是否有迴路。統計是否只有只有一個根,判斷是否連通!注意特殊數據0 0 應該輸出Yes!!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1000010
int parent[MAX];
int cnt[MAX];
int n,flag;
int max(int x,int y,int z)
{
if (x<y)
x=y;
if (x<z)
x=z;
return x;
}
void UFset()
{
int i;
for (i=1;i<=MAX;i++)
{
parent[i]=-1;
cnt[i]=0;
}
}
int find(int x)
{
int s;
for (s=x;parent[s]>0;s=parent[s]);
while (x!=s)
{
int temp=parent[x];
parent[x]=s;
x=temp;
}
return x;
}
void unio(int R1,int R2)
{
int r1=find(R1);
int r2=find(R2);
if (parent[r1]>parent[r2])
{
parent[r1]+=parent[r2];
parent[r2]=r1;
}
else
{
parent[r2]+=parent[r1];
parent[r1]=r2;
}
}
int main()
{
int ans=0;
while (1)
{
flag=1;
int u,v,i,j,n=0,tot=0;
UFset();
while (1)
{
scanf("%d%d",&u,&v);
if (u==-1&&v==-1)
{
ans=1;
break;
}
else if (u==0&&v==0)
{
break;
}
if (!cnt[u])
{
cnt[u]=1;
n++;
}
if (!cnt[v])
{
cnt[v]=1;
n++;
}
if (flag)
{
if (find(u)!=find(v))
{
unio(u,v);
tot++;
}
else
{
flag=0;
}
}
}
if (ans)
break;
if (flag&&tot==n-1||n==0)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}