HDU 1878 欧拉回路

  最简单的欧拉回路了,如果结点的出度入度之和不是2的倍数,那么就不是欧拉回路。注意要判断图是否连通。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
#define pii         pair<int,int>
#define clr(a)      memset((a),0,sizeof (a))
#define rep(i,a,b)  for(int i=(a);i<=(int)(b);i++)
#define per(i,a,b)  for(int i=(a);i>=(int)(b);i--)
#define inf         0x3f3f3f3f
#define eps         1e-6
#define MAXN        1<<20
#define MAXM        100000007
#define MOD         1000000007
#define debug       puts("reach here")
#define MP          make_pair
#define PB          push_back
#define RI(x)       scanf("%d",&x)
#define RII(x,y)    scanf("%d%d",&x,&y)
#define RIII(x,y,z) scanf("%d%d%d",&x,&y,&z)
typedef long long LL;

int g[MAXN];
int n, m;
int f[MAXN];
int h[MAXN];
int r[MAXN];
vector<int> vs[MAXN];

void init()
{
    clr(g); clr(h);
    rep(i,0,n)
        f[i] = i, vs[i].clear();
}

int find(int x)
{
    return f[x] == x ? x : (f[x] = find(f[x]));
}

void union_set(int a, int b)
{
    int x = find(a);
    int y = find(b);
    f[x] = y;
}

int main()
{
    int a, b;
    while(RII(n, m) != EOF)
    {
        init();
        rep(i,1,m)
        {
            RII(a, b);
            g[a]++; g[b]++;
            union_set(a, b);
        }
        rep(i,1,n) find(i);
        int k = 0;
        rep(i,1,n)
        {
            if(!h[f[i]])
            {
                h[f[i]] = ++k;
                r[k] = f[i];
                vs[k].PB(i);
            }
            else
                vs[h[f[i]]].PB(i);
        }
        int cnt = 0;
        rep(i,1,k)
        {
            int tmp = 0;
            int num = vs[i].size();
            rep(j,0,num-1)
                tmp += g[vs[i][j]]&1;
            
            if(tmp == 0 && num != 1) cnt++;
            else cnt += tmp / 2;
        }
        printf("%d\n", cnt);
    }
    return 0;
}
View Code

相关文章: