HDU

题意:就是给出一张无相图,判断有没有回路
思路:对于无向图判环问题,可以采用dfs染色或则并查集的方式
如果使用并查集的话,如果存在环即在某次 将某边的两个结点 进行比较,如果发现已经在同一个集合则说明存在环

完整代码:

#include<cstdio>
#include<iostream>
#include<cstring>
const int maxn = 1e5+5;
using namespace std;
int flag;
int pre[maxn];
int vis[maxn];
int find(int x)
{
    if(x!=pre[x]) return pre[x] = find(pre[x]);
    else return pre[x];
}
void unite(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx!=fy)    pre[fy]=fx;
    else    flag = 0;
}
void init(){
    for(int i=0;i<maxn;i++){
        pre[i]=i;vis[i]=0;
        flag=1;
    }
}
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b)){
        if(a==-1&&b==-1) break;
        if(a==0&&b==0){
            printf("Yes
");
            continue;
        }
        init();
        unite(a,b);
        vis[a]= vis[b] = 1;
        while(scanf("%d%d",&a,&b)&&a&&b){
            unite(a,b);
            vis[a]=1;
            vis[b]=1;
        }
        if(flag==0){
            printf("No
");
            continue;
        }
        else{
            int cont=0;
            for(int i=0;i<=maxn;i++){
                if(vis[i]&&pre[i]==i)
                cont++;
            }
            if(cont==1){
                printf("Yes
");
            }else{
                printf("No
");
            }
        }
    }
}
原文地址:https://www.cnblogs.com/Tianwell/p/11297444.html