[HDU

基础并查集

要注意的点就是成环和空集,成环即Union拥有相同的根的两个点必然就会成环,此时是输出“NO”的。

而空集是要输出“YES”的。

#include <bits/stdc++.h>

using namespace std;
int ok;
int fa[100000 + 10];
int vis[100000 + 10];
int Find(int a)
{
    int r=a;
    while(fa[r]!=r)
        r=fa[r];
    int i=a;
    int j;

    while(i!=r)
    {
        j=fa[i];
        fa[i]=r;
        i=j;
    }
    return r;

}
void merge(int a,int b)
{
    int A,B;
    A=Find(a);
    B=Find(b);
    if(A!=B) fa[B]=A;
    else ok=1;
    
}

int main()
{
    int temp1, temp2;
    while (~scanf("%d %d", &temp1, &temp2))
    {
        if(temp1==0&&temp2==0)
        {
            printf("Yes
");
            continue;
        }

        if (temp1 + temp2 == -2)
            break;
        ok = 0;
        int a = temp1, b = temp2;
        for (int i = 1; i <= 100000; i++)
        {
            fa[i] = i;
            vis[i] = 0;
        }
        merge(a, b);
        vis[a] = 1;
        vis[b] = 1;
        int flag = 0;

        while (scanf("%d %d", &a, &b))
        {
            if (!a && !b)
                break;
            vis[a] = 1;
            vis[b] = 1;
            merge(a,b);
        }
        if (ok)
        {
            printf("No
");
            continue;
        }
        int total = 0;
        for (int i = 1; i <= 100000; i++)
            if (vis[i] && fa[i] == i)
                total++;

        if (total != 1)
            printf("No
");
        else
            printf("Yes
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Vikyanite/p/11385443.html