1. 程式人生 > >小鑫的城堡 2798

小鑫的城堡 2798

小鑫的城堡

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; }