无向图其实跟有向图的做法是一样的,一直以为是不一样的,要好好深入学习一下。
输出路径方法:dfs,而且用一个栈保存经过的边,然后把栈的边逆顺序输出就是欧拉回路。
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; struct edge { int v, vis, next; } edge[1004 << 1]; int head[55], E; void init() { memset(head, -1, sizeof(head)); E = 0; } void add(int s, int t) { edge[E].v = t; edge[E].vis = 0; edge[E].next = head[s]; head[s] = E++; edge[E].v = s; edge[E].vis = 0; edge[E].next = head[t]; head[t] = E++; } int n, d[55]; void dfs(int u) { int i; for (i = head[u]; ~i; i = edge[i].next) { if (!edge[i].vis) { edge[i].vis = edge[i ^ 1].vis = 1; dfs(edge[i].v); printf("%d %d\n", edge[i].v, u); } } } int main() { int i, cas, ca = 1; scanf("%d", &cas); while (cas--) { scanf("%d", &n); init(); int x, y, sta; for (i = 1; i <= 50; i++) d[i] = 0; while (n--) { scanf("%d%d", &x, &y); add(x, y); d[x]++; d[y]++; sta = x; } printf("Case #%d\n", ca++); for (i = 1; i <= 50; i++) if (d[i] & 1) { printf("some beads may be lost\n"); break; } if (i > 50) dfs(sta); puts(""); } return 0; }