小鑫的城堡 2798
阿新 • • 發佈:2018-12-02
小鑫的城堡
Problem Description
從前有一個國王,他叫小鑫。有一天,他想建一座城堡,於是,設計師給他設計了好多簡易圖紙,主要是房間的連通的圖紙。小鑫希望任意兩個房間有且僅有一條路徑可以相通。小鑫現在把設計圖給你,讓你幫忙判斷設計圖是否符合他的想法。比如下面的例子,第一個是符合條件的,但是,第二個不符合,因為從5到4有兩條路徑(5-3-4和5-6-4)。
Input
多組輸入,每組第一行包含一個整數m(m < 100000),接下來m行,每行兩個整數,表示了一條通道連線的兩個房間的編號。房間的編號至少為1,且不超過100000。
Output
每組資料輸出一行,如果該城堡符合小鑫的想法,那麼輸出"Yes",否則輸出"No"。
Sample Input
5
2 5
2 3
1 3
3 6
4 6
6
1 2
1 3
3 4
3 5
5 6
6 4
Sample Output
Yes
No
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int f[110000],a[110000],b[110000];
//int cmp(const void *a,const void *b)
//{
// return (*(struct node *)a).c-(*(struct node *)b).c;
//}
int find(int x)
{
if(x!=f[x])
{
f[x]=find(f[x]);
}
return f[x];
}
void join (int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
f[y]=x;
}
}
int main()
{
int n,m,i,u,v,c;
while(scanf("%d",&n)!=EOF)
{
m=0;c=0;
memset(a,0,sizeof(a));
for(i=1; i<=110000; i++)
f[i]=i;
for(i=0; i<n; i++)
{
scanf ("%d%d",&u,&v);
// if(u>max) max=u;
// if(v>max) max=v;
a[u]=1;
a[v]=1;
join(u,v);
}
for(i=1;i<=110000;i++)
{
if(i==f[i]&&a[i]==1) m++;
if(a[i]==1) c++;
}
if(m==1&&n==c-1) printf("Yes\n");
else printf("No\n");
}
return 0;
}