现在的位置: 首页 > 综合 > 正文

UVA 10054 无向图的欧拉回路输出路径

2014年07月19日 ⁄ 综合 ⁄ 共 858字 ⁄ 字号 评论关闭

无向图其实跟有向图的做法是一样的,一直以为是不一样的,要好好深入学习一下。

输出路径方法: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;
}

【上篇】
【下篇】

抱歉!评论已关闭.