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; }