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

原文地址:https://www.cnblogs.com/cchun/p/2520119.html