• HDU1878欧拉回路(入门题+并查集)


    题意:

           判断一个图是否是欧拉回路。

    欧拉回路:

                  图 G 的一个回路,若它通过 G 中每条边一次且仅一次,则称为欧拉回路。

                  其中有著名的哥尼斯堡七桥问题或一笔画问题。(原来小时候我们就接触欧拉回路了,欧拉回路还是蛮常见,蛮简单的)

    解题思路:

           只要每个点都有入度,出度,那么这个图就是一个欧拉回路。然后再用并查集判断一个图是否是连通的即可。

    代码:

    #include<iostream> 
    using namespace std; 
     
    const int MAX=1005
     
    int dep[MAX],father[MAX],du[MAX]; 
     
    int find_set(int x) 

        if(x!=father[x]) 
        { 
            father[x]=find_set(father[x]);//回溯压缩路径 
        } 
        /*所有的子节点的根都归到boss下*/ 
        return father[x]; 

     
    void union_set(int f1,int f2) 

        f1=find_set(f1); 
        f2=find_set(f2); 
        if(f1==f2) 
            return ; 
        if(dep[f1]>dep[f2]) 
        { 
            father[f2]=f1; 
        } 
        else 
        { 
            if(dep[f1]==dep[f2]) 
            { 
                dep[f2]++; 
            } 
            father[f1]=f2; 
        } 
        return ; 

     
    void init(int n) 

        for(int i=0;i<=n;i++) 
        { 
            father[i]=i; 
            dep[i]=0
        } 
        memset(du,0,sizeof(du)); 

     
    int main(void

        int point,edge; 
        int count,i,u,v; 
        bool exist; 
        while(scanf("%d",&point),point) 
        { 
            scanf("%d",&edge); 
            init(point); 
            for(i=0;i<edge;i++) 
            { 
                scanf("%d%d",&u,&v); 
                du[u]++; 
                du[v]++; 
                union_set(u,v);        
            } 
            exist=1
            for(i=0;i<=point;i++) 
            { 
                if(du[i]&&du[i]%2!=0
                { 
                 
                    exist=0;     
                    break
                } 
             
            } 
            for(i=0,count=0;i<=point;i++) 
            { 
                if(du[i]&&i==find_set(i)) 
                    count++; 
            } 
            if(exist) 
            { 
                if(count!=1
                    cout<<"0"<<endl; 
                else 
                    cout<<"1"<<endl; 
            } 
            else 
                cout<<"0"<<endl; 
        } 
        return 0

  • 相关阅读:
    Python正则表达式(3)--字符串匹配开头结尾
    Python正则表达式(2)---字符串匹配多个字符
    Python正则表达式(1) --匹配单个字符
    Navicate Premium 永久破解
    升级pip指令
    爬虫(自学)之User Agent 第三方库my_fake_useragent 和 fake_useragent
    django drf 反序列化上传图片
    git的使用
    python 爬虫 基本库使用urllib之urlopen(一)
    吉他入门第三讲~~~~~和弦
  • 原文地址:https://www.cnblogs.com/cchun/p/2520119.html
Copyright © 2020-2023  润新知