图论 欧拉回路

HDU 1878

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#include<queue>
using namespace std;
typedef long long  ll;
#define me(x) memset(x, -1, sizeof(x))
#define mem(x) memset(x, 0, sizeof(x))
const int MOD = 1e18;
const int N = 2e5 + 5;
ll n, m;
struct node
{
    int u, v;
}ed[N];

int id, vis[N], p[N], dep[N];
void add(int u, int v)
{
    ed[id].u=u;
    ed[id].v=v;
    id++;
}
void ini()
{
    id=0;
    mem(vis);
    mem(dep);
    for(int i=1; i<=n; i++)
        p[i]=i;
}

int Find(ll x)
{
    int r=x;
    while(r!=p[r])
        r=p[r];
    int i=x, t;
    while(r!=p[i])
    {
        t=p[i];
        p[i]=r;
        i=t;
    }
    return r;
}
void join()
{
    for(int i=0; i<id; i++)
    {
        int x=Find(ed[i].u), y=Find(ed[i].v);
        if(x!=y)
            p[x]=y;
    }
}

int main()
{
    int i, j, k, x, l;
    int u, v, t;
    while(~scanf("%d", &n))
    {
        if(!n) return 0;
        scanf("%d", &m);
        ini();
        for(i=0; i<m; i++)
        {
            scanf("%d%d", &u, &v);
            add(u,v); add(v,u);
            dep[u]++, dep[v]++;
        }
        join();
        k=-1;
        for(i=1; i<=n; i++)
        {
            k=Find(i);
            if(!i) m=k;
            else if(k!=m) break;
        }
        if(i<n) {cout<<0<<endl;continue;}
        k=0;
        for(i=1; i<=n; i++)
        {
            if(dep[i]%2) {k=1;break;}
        }
        if(!k)cout<<1<<endl;
        else cout<<0<<endl;
    }
    return 0;
}

 

posted @ 2019-08-01 16:38  op-z  阅读(131)  评论(0编辑  收藏  举报