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;

}

 

你可能感兴趣的:(路径)