小希的迷宫(并查集,未知点,限定一个老大,判断是否有圈)

本文深入探讨并查集在图论中的应用,特别关注于如何利用并查集判断是否存在图中的环路。通过实例解析,解释了如何在已知点的情况下标记并查找连通性,进而判断是否存在圈。详细介绍了算法实现步骤,包括初始化、查找和合并操作,并通过案例演示了判断逻辑。


/*
这一题是并查集的知识
常规的并查集是让你找是否连成圈或者连成几个圈或者让你找老大的个数
这一题是让你在一个老大的情况下(需要判断)判断是否存在圈的问题!
还有就是这一题没有告诉你有几个点,所以你需要将已知的点标记一下!
一开始我只想着判断是否有圈去了,其实老大跟圈是没有一点关系的!
老大多了也可以没有一个圈!
*/
#include<cstdio>
#include<iostream>
#include<cstring>
const int maxs=100010;
using namespace std;
int a[maxs],vis[maxs],flag;
int Find(int x)
{
    int r=x;
    while(r!=a[r])
        r=a[r];
    return r;
}
void mix(int x,int y)
{
    int fx=Find(x),fy=Find(y);
    if(fx!=fy)
    {
        a[fy]=fx;
    }
    else
    {
        flag=1;
    }
}
int main()
{
    int b,c,i,num;
    while(scanf("%d%d",&b,&c))
    {
        num=flag=0;
        if(b==-1&&c==-1)
        {
            break;
        }
        if(b==0&&c==0)
        {
            printf("Yes\n");
            continue;
        }
        for(i=1;i<maxs;i++)
        {
            a[i]=i;
            vis[i]=0;
        }
        vis[b]=vis[c]=1;//标记访问的点!
        mix(b,c);
        while(scanf("%d%d",&b,&c),(b+c))
        {
            vis[b]=vis[c]=1;
            mix(b,c);
        }
        for(i=1;i<maxs;i++)
        {
            if(vis[i]&&a[i]==i)
            {
                num++;
            }
            if(num>1)
            {
                break;
            }
        }
        if(!flag&&num<=1)
        {
            printf("Yes\n");
        }
        else
        {
            printf("No\n");
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值