HDU 1272 小希的迷宫

本文介绍了一种使用并查集算法检测无向图中是否存在环的方法,并通过一个具体的编程实例展示了如何统计无环图中的顶点数与边数,确保图是一棵树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

并查集用来检测无向图的环是一个非常好的工具。

对于这道题,先要统计出有多少个顶点,假设有n个,再算出边的总数,如果n=m+1,那么满足题目要求。

关键是如果算出边数呢,而且算的同时又不能加那些会成环的边?我们可以用并查集维护,如果两个点有边相连,那么将它们连入同一个集合,并统计连入的边数,在连入之前先判断它们是否属于同一个集合,如何已经属于同一个集合那么这条边再连上去,就要成环了,所有这个时候就不能连上这条边。

边算出来,问题就解决了。

下面是AC代码:

#include<iostream>
using namespace std;
const int maxn=100005;
int fa[maxn],n,m,flag,vis[maxn],sum;
void init()
{
    for(int i=0;i<maxn;i++) fa[i]=i;
}
int Find(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=Find(fa[x]);
}
void Merge(int x,int y)
{
    x=Find(x);
    y=Find(y);
    if(x==y) flag=1;
    else fa[y]=x,sum++;//统计出现了多少不会成环的边
}
int main()
{
    int x,y;
    while(cin>>x>>y&&(x+y)!=-2)
    {
        init();
        if( x==0 && y==0 ){     //为空树
               cout<<"Yes"<<endl;
               continue;
           }
        int cnt=0;flag=0;sum=0;
        fill(vis,vis+maxn,0);
        if(!vis[x]) vis[x]=1,cnt++;//统计出现了多少顶点
        if(!vis[y]) vis[y]=1,cnt++;
        Merge(x,y);
        while(cin>>x>>y&&x+y)
        {
            if(!vis[x]) vis[x]=1,cnt++;
            if(!vis[y]) vis[y]=1,cnt++;
            Merge(x,y);
        }
        if(cnt==sum+1&&!flag) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值