给定无向图,求从节点 1 出发的欧拉回路(每条边恰好经过一次,回到起点)。输出路径节点序列。
id,访问时标记 vis[id]=1head[u] 跳过已访问边,避免重复扫描#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXE = 120000;
const int MAXV = 11000;
struct Edge { int v, id, next; } edge[MAXE];
int head[MAXV], cnt, vis[MAXE], path[MAXE], tot;
void addEdge(int u, int v, int id) {
edge[cnt] = {v, id, head[u]};
head[u] = cnt++;
}
void dfs(int u) {
for (int &i = head[u]; i != -1; i = edge[i].next) {
if (!vis[edge[i].id]) {
vis[edge[i].id] = 1;
int v = edge[i].v;
dfs(v);
}
}
path[tot++] = u;
}
int main() {
int n, m;
while (scanf("%d%d", &n, &m) == 2) {
memset(head, -1, sizeof(head));
cnt = tot = 0;
memset(vis, 0, sizeof(vis));
for (int i = 0; i < m; ++i) {
int u, v; scanf("%d%d", &u, &v);
addEdge(u, v, i<<1);
addEdge(v, u, i<<1|1);
}
dfs(1);
for (int i = tot-1; i >= 0; --i)
printf("%d\n", path[i]);
}
return 0;
}
本题保证有解,无需预检查。