• hdu 1325 Is It A Tree?(并查集)


    题意:给出点、边,判断是不是一棵树

    思路:问题是如何判断是不是树?

    我总结了一下,但不官方,正确性待验证。

    1.入度<=1(根节点为0,其他为1)

    2.不能有环

    3.只有一个根节点

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    
    #define MAXN 50000
    
    int fa[MAXN];
    int a[MAXN];
    int in[MAXN];
    
    int set_find(int d){
        if(fa[d]<0)return d;
        return fa[d]=set_find(fa[d]);
    }
    
    void set_join(int x,int y){
        x=set_find(x);
        y=set_find(y);
        if(x!=y)fa[x]=y;
    }
    
    int main(){
        int x,y,m=0,sum,i,tc=0;
        bool flag=true;
        memset(fa,-1,sizeof(fa));
        memset(in,0,sizeof(in));
    
        while(~scanf("%d%d",&x,&y)){
            if(x==-1&&y==-1)break;
            if(x==0&&y==0){
                if(flag==false)printf("Case %d is not a tree.
    ",++tc);
                else{
                    sum=0;
                    for(i=0;i<m;++i)//条件3:只有一个根节点
                        if(fa[a[i]]==-1)++sum;
                    if(sum==1)printf("Case %d is a tree.
    ",++tc);
                    else printf("Case %d is not a tree.
    ",++tc);
                }
                m=0;
                flag=true;
                memset(fa,-1,sizeof(fa));
                memset(in,0,sizeof(in));
                continue;
            }
            a[m++]=x;
            a[m++]=y;
            if(in[y]==1)flag=false;//条件1:入度小于等于1
            if(set_find(x)==set_find(y))flag=false;//条件2:不能有环
            else {
                set_join(x,y);
                ++in[y];
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Ubuntu开机自动挂载Windows分区
    Ubuntu 修改hosts
    线程安全
    可重入
    java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet问题
    两数相加
    2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)
    Anniversary party
    k倍区间
    算法训练 素因子去重
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4730956.html
Copyright © 2020-2023  润新知