hdu 1878水题

判断图是否连通,连通的话如果每个点的度为偶数就存在欧拉回路,否则就不存在。

/*

 * hdu1878/win.cpp

 * Created on: 2012-9-7

 * Author    : ben

 */

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <queue>

#include <set>

#include <map>

#include <stack>

#include <string>

#include <vector>

#include <deque>

#include <list>

#include <functional>

#include <numeric>

#include <cctype>

using namespace std;

const int MAXN = 1010;

bool graph[MAXN][MAXN];

int du[MAXN], myset[MAXN];

int N, M;



void initset() {

    for(int i = 0; i <= N; i++) {

        myset[i] = i;

    }

}



void mymerge(int a, int b) {

    if(a > b) {a ^= b;a ^= b;a ^= b;}

    for(int i = 0; i < MAXN; i++) {

        if(myset[i] == b) {

            myset[i] = a;

        }

    }

}



int main() {

#ifndef ONLINE_JUDGE

    freopen("data.in", "r", stdin);

#endif

    int a, b, i;

    while(scanf("%d", &N) == 1 && N > 0) {

        memset(graph, 0, sizeof(graph));

        memset(du, 0, sizeof(du));

        initset();

        scanf("%d", &M);

        for(i = 0; i < M; i++) {

            scanf("%d%d", &a, &b);

            if(!graph[a - 1][b - 1] && a != b) {

                graph[a - 1][b - 1] = true;

                du[a - 1]++;

                du[b - 1]++;

                if(myset[a - 1] != myset[b - 1]) {

                    mymerge(myset[a - 1], myset[b - 1]);

                }

            }

        }

        for(i = 0; i < N; i++) {

            if(du[i] % 2 != 0) {

                puts("0");

                break;

            }

        }

        if(i == N) {

            if(count(myset, myset + N, 0) == N) {

                puts("1");

            }else {

                puts("0");

            }

        }

    }

    return 0;

}

你可能感兴趣的:(HDU)