题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
题目大意:中文题目
解题思路:并查集。题目要求的迷宫有两个特点:1:无环、2:单根,因此,若同一边上的两个点拥有相同的父节点,则可以认为有环,最后加一个扫描,判断根节点个数。
AC代码:
- #include <iostream>
- using namespace std;
- int father[100005];
- bool flag ,visit[100005];
- int getfather(int n)
- {
- while(n!=father[n])
- n = father[n];
- return n;
- }
- void myunion(int x,int y)
- {
- int a = getfather(x);
- int b = getfather(y);
- if(a!=b)father[a] = b;
- else flag = false;
- }
- int main()
- {
- int n,m;
- int num;
- while(cin>>n>>m)
- {
- if(n==-1&&m==-1)break;
- if(n==0&&m==0){cout<<"Yes"<<endl;continue;}
- for(int i=1;i<100005;i++)
- {
- father[i] = i;
- visit[i] = 0;
- }
- visit[n] = visit[m] = 1;
- flag = 1;
- myunion(n,m);
- while(cin>>n>>m)
- {
- if(n==0&&m==0)break;
- myunion(n,m);
- visit[n] = visit[m] = 1;
- }
- num=0;
- for(int i=1;i<100005;i++)
- {
- if(visit[i]&&father[i]==i)num++;
- if(num>1)flag=0;
- }
- if(flag)cout<<"Yes"<<endl;
- else cout<<"No"<<endl;
- }
- return 0;
- }