zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    css的继承问题
    js弹出层
    实现网页弹出框后背景不能滑动的效果
    vue的爬坑之路(四)之基于vuecli 动态添加iconfont的symbol方法
    vue的爬坑之路(五)之基于vuecli li列表的显示隐藏
    自定义复选框checkbox样式
    vue的爬坑之路(三)之基于vuecli的VueAwesomeSwiper轮播滑块插件的使用及常见问题
    iOS 开发学习总结
    (转载)iOS股票k线组件源码,支持其他图表类型
    iOS Objective C Memory management
  • 原文地址:https://www.cnblogs.com/cchun/p/2520119.html
Copyright © 2011-2022 走看看