hdu1272并查集判环

版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/82804125

http://acm.hdu.edu.cn/showproblem.php?pid=1272

1. 合并两个点是判环 , 如果未发生合并,则说明父点是一样的,成环,

2. 判断根节点只有一个  

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 5;
const int M = 5e5 + 5;

int fa[N],root[N];
bool circle;

int Find(int k){

    while(k != fa[k])
        k = fa[k];

    return k;
}

void Merge(int x,int y){

    int dx = Find(x);
    int dy = Find(y);

    if(dx != dy)
        fa[dx] = dy;
    else
        circle = true;
}
int main()
{
    int a, b;

    while(cin >> a >> b && a != -1 && b != -1){

        if(a == b && a == 0){
            cout << "Yes" << endl;
            continue;
        }
        
        for(int i = 0;i < N;i ++)
            fa[i] = i, root[i] = 0;

        root[a] = root[b] = 1;
        Merge(a,b);
        circle = false;

        while(cin >> a >> b && a && b){

            root[a] = root[b] = 1;
            Merge(a,b);
        }

        int ans = 0;
        for(int i = 1;i < N;i ++){

            if(root[i] && fa[i] == i)
                ans ++;
            if(ans > 1){
                circle = true;
                break;
            }
        }

        if(circle)
            cout << "No" <<endl;
        else
            cout << "Yes" << endl;
    }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Soul_97/article/details/82804125