小希的迷宫——并查集入门

题目链接

题意:

给定一个无向图,判断该图是否满足:任意两点有且仅有一条路径。

题解:

用并查集判断是否有且仅有一个根节点即可

首先如果在并查集维护的过程中遇到两点已经在同一个根节点下,那么就不满足只有一条路径,如果并查集维护完成,发现根节点个数>1那么也不满足

因为输入是不定向输入,所以用数组标记输入,for循环来判断是否 f【i】== i

 

代码:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int f[maxn],vis[maxn];
int flag=1;
int Find(int x)
{
    return x==f[x]?x:f[x]=Find(f[x]);
}
void join(int x,int y)
{
    int fx=Find(x);
    int fy=Find(y);
    if(fx!=fy)
    {
        f[fx]=fy;
        return ;
    }
    flag=0;
}
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        if(a==-1 && b==-1)break;
        if(a==0 && b==0){printf("Yes\n");continue;}
        for(int i=0;i<maxn;i++)f[i]=i,vis[i]=0;
        join(a,b);
        vis[a]=1;
        vis[b]=1;

        while(~scanf("%d%d",&a,&b) && (a || b))
        {
            join(a,b);
            vis[a]=1;
            vis[b]=1;
        }
        if(!flag){printf("No\n");continue;}

        int cnt=0;

        for(int i=0;i<maxn;i++)
        {
            if(vis[i] && f[i]==i)cnt++;
        }

        if(cnt==1)printf("Yes\n");
        else printf("No\n");

    }

    return 0;
}
View Code

 

posted @ 2019-09-29 20:05  。小姜  阅读(255)  评论(0)    收藏  举报