并查集80分求解!(已经有判断是否是生成树的Judge)
  • 板块P2307 迷宫
  • 楼主jjj0523
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/9 10:45
  • 上次更新2023/10/23 22:08:32
查看原帖
并查集80分求解!(已经有判断是否是生成树的Judge)
945630
jjj0523楼主2023/3/9 10:45
#include<bits/stdc++.h>
using namespace std;

int f[100001];//并查集数组

void Init()
{
    for(int i=1;i<=100000;i++)
    {
        f[i]=i;
    }
}
int find(int x)
{
    while(x != f[x])
    {
        x = f[x];
    }
    return x;
}

bool Union(int x,int y)
{
    int fax = find(x);
    int fay = find(y);
    if(fax == fay)
    {
        return false;//两个节点有相同的父亲说明产生了环
    }
    else
    {
        f[fax]=fay;//合并
        return true;
    }
}

bool ans=true;
void Judge()
{
    //找到第一个非根节点
    int root;
    int i;
    while(i<=100000)
    {
        if(f[i]!=i)
        {
            root = find(i);
            break;
        }
        i++;
    }
    //从第一个非根之后开始判断
    for(int j=i+1;j<=100000;j++)
    {
        if(f[j]!=j) //此节点不是根
        {
            if (find(j) != root) {
                ans = false;
                break;//已经出现两根不同
            }
        }
    }
}

int main()
{
    int a,b;
    Init();
    while(true)
    {
        scanf("%d%d",&a,&b);
        if(a==-1&&b==-1)
        {
            break;
        }
        if(a==0&&b==0)
        {
            //已经出现了结束标志
            Judge();//判断此时并查集数组中是否所有节点只有一个相同的根
            if(ans==true)
            {
                printf("1");
                printf("\n");
            }
            else
            {
                printf("0");
                printf("\n");
            }
            Init();//输入完成一组数据则重置父亲数组
            ans=true;
            continue;
        }
        if(Union(a,b)==true)
        {
            continue;
        }
        else
        {
            ans=false;
            continue;
        }
    }
}
2023/3/9 10:45
加载中...