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

  • 相关阅读:
    JDBC 查询的三大参数 setFetchSize prepareStatement(String sql, int resultSetType, int resultSetConcur)
    有空必看
    SpringMVC 利用AbstractRoutingDataSource实现动态数据源切换
    FusionCharts JavaScript API Column 3D Chart
    FusionCharts JavaScript API
    FusionCharts JavaScript API
    Extjs 继承Ext.Component自定义组件
    eclipse 彻底修改复制后的项目名称
    spring 转换器和格式化
    Eclipse快速生成一个JavaBean类的方法
  • 原文地址:https://www.cnblogs.com/cchun/p/2520119.html
Copyright © 2011-2022 走看看