hdu 1257 小希的迷宫 并查集
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1272
题意:
题解:
用并查集来判断是否都在一个集合里面,是否成环,就好了
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define MS(a) memset(a,0,sizeof(a)) 5 #define MP make_pair 6 #define PB push_back 7 const int INF = 0x3f3f3f3f; 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 9 inline ll read(){ 10 ll x=0,f=1;char ch=getchar(); 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 12 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 13 return x*f; 14 } 15 ////////////////////////////////////////////////////////////////////////// 16 const int maxn = 1e5+10; 17 18 int mark[maxn],fa[maxn]; 19 20 int find(int x){ 21 return fa[x]==x ? x : fa[x]=find(fa[x]); 22 } 23 24 bool Union(int u,int v){ 25 int t1 = find(u), t2 = find(v); 26 if(t1 == t2) return false; 27 fa[t1] = t2; 28 return true; 29 } 30 31 int main(){ 32 int a,b; 33 while(scanf("%d%d",&a,&b)){ 34 if(a==-1 && b==-1) break; 35 if(a==0 && b==0){ 36 puts("Yes"); 37 continue; 38 } 39 40 MS(mark); 41 for(int i=0; i<=maxn; i++) 42 fa[i] = i; 43 44 mark[a] = mark[b] = 1; 45 fa[a] = b; 46 int flag = 1; 47 while(scanf("%d%d",&a,&b) && (a+b)){ 48 mark[a] = mark[b] = 1; 49 if(Union(a,b)==0) 50 flag = 0; 51 } 52 if(flag==0) 53 puts("No"); 54 else{ 55 int cnt = 0; 56 for(int i=1; i<=maxn; i++){ 57 if(mark[i] && fa[i]==i) 58 cnt++; 59 } 60 if(cnt == 1) 61 puts("Yes"); 62 else 63 puts("No"); 64 } 65 } 66 67 return 0; 68 }