hrbustOJ 欧拉路径(判断无向图是否连通+统计顶点的度数)

/*
  Name: 判断无向图是否连通+统计顶点的度数 
  Copyright: 
  Author: Try86
  Date: 14/04/12 23:02
  Description: 邻接链表存图 
*/

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 105;
int deg[N];  //统计顶点的度数 
bool map[N][N], color[N];
struct node {
    int v;
    node *next;
    node (int vv, node *p) {
        v = vv;
        next = p;
    }
};
struct graph {
    node *link;
}G[N];
int counts;

void init(int n) {//初始化图 
    for (int i=1; i<=n; ++i) {
        G[i].link = NULL;
    }
    return ;
}

void buildG(int u, int v) {//建图 
    node *p = new node(v, G[u].link);
    G[u].link = p;
    return ;
}

void dfsVisit(int u) {
    color[u] = false;
    for (node *p=G[u].link; p; p=p->next) {
        if (color[p->v]) dfsVisit(p->v);
    }
    return ;
}

void dfs(int n) {//dfs判断图是否连通 
    for (int i=1; i<=n; ++i) color[i] = true;
    for (int i=1; i<=n; ++i) {
        if (color[i]) {
            ++counts;
            if (counts > 1) break;
            dfsVisit(i);
        }
    }
    return ;
}

void del(int u) {//释放邻接链表所占内存 
    node *p = G[u].link;
    while (G[u].link) {
        G[u].link = p->next;
        delete p;
        p = G[u].link;
    }
    return ;
}

int main() {
    int n, m;
    while (scanf("%d%d", &n, &m) != EOF) {
        memset(deg, 0, sizeof(deg));
        memset(map, false, sizeof(map));
        init(n);
        int u, v;
        for (int i=0; i<m; ++i) {
            scanf ("%d%d", &u, &v);
            if (!map[u][v] || !map[v][u]) {//去重边 
                map[u][v] = map[v][u] = true;
                buildG(u, v);
                buildG(v, u);
            }
            ++deg[u];
            ++deg[v];
        }
        counts = 0;
        dfs(n);
        if (counts > 1) {
            printf ("Graph is not connected!\n");
            continue;
        }
        counts = 0;
        for (int i=1; i<=n; ++i) {
            if (deg[i]%2) ++counts;
        }
        if (counts == 2) {
            printf ("have Euler path\n");
            continue;
        }
        if (counts == 0) {
            printf ("have Euler Circuit\n");
            continue;
        }
        printf ("have no Euler path\n");
        for (int i=1; i<=n; ++i) del(i);
    }
    return 0;
}

 

posted on 2012-04-15 07:36  Try86  阅读(534)  评论(0)    收藏  举报