Fork me on GitHub

HDU 1878 欧拉回路

并查集水题。

一个图存在欧拉回路的判断条件:

无向图存在欧拉回路的充要条件

    一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数且该图是连通图。

有向图存在欧拉回路的充要条件

    一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图

 

1.每次加点都对两个点的度数加1

2.加点时如果两点不在同一集合,则合并两点所在集合。

3.最后统计每个点度数是否为偶数,并且判断连不连通。

 

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define N 1100

int du[N];
int fa[N];

void makeset(int n)
{
    for(int i=1;i<=n;i++)
    {
        fa[i] = i;
    }
}

int findset(int x)
{
    if(x != fa[x])
    {
        fa[x] = findset(fa[x]);
    }
    return fa[x];
}

void unionset(int a,int b)
{
    int x = findset(a);
    int y = findset(b);
    if(x != y)
    {
        fa[x] = y;
    }
}

int main()
{
    int n,m,i;
    int a,b;
    while(scanf("%d",&n)!=EOF && n)
    {
        memset(du,0,sizeof(du));
        makeset(n);
        scanf("%d",&m);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            du[a]++;
            du[b]++;
            unionset(a,b);
        }
        int flag = 1;
        int cnt = 0;
        for(i=1;i<=n;i++)
        {
            if(fa[i] == i)
                cnt++;
        }
        if(cnt>=2)
            flag = 0;
        if(flag){
        for(i=1;i<=n;i++)
        {
            if(du[i]%2 != 0)
            {
                flag=0;
                break;
            }
        }
        }
        if(flag)
            cout<<1<<endl;
        else
            cout<<0<<endl;
    }
    return 0;
}
View Code

 

 

posted @ 2014-01-03 19:42  whatbeg  阅读(201)  评论(0编辑  收藏  举报