Hdu 1878

欧拉回路


题意:若是欧拉回路,输出1,否则输出0


分析:先深搜判断是不是属于一个联通分支;再判断奇度数的节点是否为0.


AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <algorithm>

using namespace std;
using std::vector;

const int MAXN = 1005;

bool vis[MAXN];
int deg[MAXN];
vector<int > v[MAXN];

void Init() {
    memset(vis, 0, sizeof(vis));
    memset(deg, 0, sizeof(deg));
    memset(v, 0, sizeof(v));
} 

void DFS(int x) {
    vis[x] = 1;
    for(int i = 0; i < v[x].size(); i++) {
        int n = v[x][i];
        if(!vis[n]) 
            DFS(n);
    }
}

bool ADJ(int n) {
    for(int i = 1; i <= n; i++) {
        if(!vis[i])
            return false;
    }
    return true;
}

bool EULER(int n) {
    for(int i = 1; i <= n; i++) {
        if(deg[i] % 2 != 0)
            return false;
    }
    return true;
}

int main() {
    int n, m;
    while(scanf("%d%d", &n, &m)!=EOF && n) {
        Init();
        int a, b;
        for(int i = 1; i <= m; i++) {
            scanf("%d%d", &a, &b);
            deg[a]++;
            deg[b]++;
            v[a].push_back(b);
            v[b].push_back(a);
        }
        DFS(a);
        if(ADJ(n) && EULER(n)) 
            printf("1\n");
        else printf("0\n");
    }
    return 0;
}


你可能感兴趣的:(Hdu 1878)