hdu1272 小希的迷宫 并查集

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272

题目就是判断是否连通图及是否存在回路

简单的并查集

两两合并,如果存在同一个集合,则No

如果不是一个连通图 则No

否则 Yes

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 using namespace std;
 6 int parent[100100];
 7 bool flag;
 8 int num[100100];
 9 int Find(int x)
10 {
11    int s;
12    for(s=x;parent[s]>=0;s=parent[s]);
13    return s;
14 }
15 void Union(int r1,int r2)
16 {
17     if(flag) return ;
18    int R1=Find(r1);
19    int R2=Find(r2);
20    if(R1!=R2) {
21            parent[R1]=R2;
22            return ;
23    }
24    if(R1==R2)
25       flag=1;
26 
27    
28 }
29 int main()
30 {
31     int u,v;
32     int tol;
33     int block;
34     while(scanf("%d%d",&u,&v)!=EOF)
35     {
36       flag=0;
37       block=0;
38       memset(parent,-1,sizeof(parent));
39       memset(num,0,sizeof(num));
40       if(u==-1 && v==-1 ) break;
41       if(u==0 && v==0) 
42               {
43                       cout<<"Yes"<<endl;
44                       continue;
45               }
46        Union(u,v);
47        num[u]++;
48        num[v]++;
49        while(scanf("%d%d",&u,&v)!=EOF)
50        {
51                if(u==0 && v==0) break;
52                Union(u,v);
53                num[u]++;
54                num[v]++;
55        }
56       for(int i=1;i<=100000;i++)
57               if(parent[i]==-1 && num[i]>0) block++;
58       if(block>1)
59        cout<<"No"<<endl;
60       else
61          if(flag) cout<<"No"<<endl;
62          else
63           cout<<"Yes"<<endl;
64     }
65     return 0;
66 }

 

posted on 2013-10-21 16:02  GyyZyp  阅读(179)  评论(0编辑  收藏  举报

导航