首页 > 代码库 > HDU-1878 判断无向图欧拉回路,水

HDU-1878 判断无向图欧拉回路,水

HDU 1878

题意:问一个无向图是否存在欧拉回路。

总结

1、一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
2、一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。
3、要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:
假设有一张图有向图G‘,在不论方向的情况下它与G同构。并且G‘包含了G的所有有向边。那么如果存在一个图G‘使得G‘存在欧拉回路,那么G就存在欧拉回路。

技术分享
// HDU-1878
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define F(i,a,b)  for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 1e3+10;

int father[N];
int Find(int c)
{
    int p=c,i=c,j;
    while(father[p]!=p)  p=father[p];
    while(father[i]!=p) {
        j=father[i], father[i]=p, i=j;
    }
    return p;
}
bool Unite(int u,int v)
{
    int fau=Find(u), fav=Find(v);
    if(fau!=fav) { father[fav]=fau; return true; }
    return false;
}

int degree[N];
int main()
{
    int n, m;
    while(scanf("%d", &n) && n) {
        scanf("%d", &m);
        mes(degree, 0);
        FF(i,1,n) father[i]=i;
        FF(i,1,m) {
            int u, v;
            scanf("%d%d", &u, &v);
            if(u!=v) {
                degree[u]++, degree[v]++;
                if(Unite(u, v)) ;
            }
        }
        int flag=0, cnt=0;
        FF(i,1,n) if(degree[i]&1) flag=1;
        FF(i,1,n) if(father[i]==i) cnt++;
        if(flag || cnt>1) puts("0");
        else puts("1");
    }

    return 0;
}
HDU-1878

HDU-1878 判断无向图欧拉回路,水