hdu1272小希的迷宫(并查集判断回路和是否连通)

传送门

迷宫中不能有回路,还要连通

如果最后集合数是一个那就是连通,否则不联通

要合并的两个顶点在相同集合内,表示出现了回路

输入时注意一下

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int f[100005];
 4 int getf(int v)
 5 {
 6     if(f[v]==v)return v;
 7     else
 8     {
 9         f[v]=getf(f[v]);
10         return f[v];
11     }
12 }
13 void merge(int v,int u)
14 {
15     int t1,t2;
16     t1=getf(v);
17     t2=getf(u);
18     if(t1!=t2)
19     {
20         f[t2]=t1;
21         
22     }
23     return;
24 }
25 void init()
26 {
27     for(int i=1; i<100005; i++)
28     {
29         f[i]=i;
30     }
31 }
32 int data[100005];
33 int main()
34 {
35     int x,y,num=0,maxx=-1,ans=0,flag=0;
36     memset(data,0,sizeof(data));
37     init();
38     while(scanf("%d %d",&x,&y))
39     {
40         if(x==-1&&y==-1)break;
41         if(x!=0&&y!=0)
42         {
43             if(getf(x)==getf(y))flag=1;
44             data[x]=x;
45             data[y]=y;
46             merge(x,y);
47             //int temp=x>y?x:y;
48         //    maxx=maxx>temp?maxx:temp;
49         }
50         if(x==0&&y==0)
51         {
52             for(int i=1; i<=100005; i++)
53             {
54                 if(data[i])
55                 {
56                     if(getf(i)==i)ans++;
57                 }
58             }
59             if(flag||ans>1)
60             {
61                 printf("No\n");
62             }
63             else
64             {
65                 printf("Yes\n");
66             }
67             num=0,maxx=-1,ans=0,flag=0;
68             memset(data,0,sizeof(data));
69             init();
70         }
71     }
72     return 0;
73 }
View Code

 

转载于:https://www.cnblogs.com/fqfzs/p/9991546.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值