思路:
深搜的时候,可以生成一棵树。
深搜也就是深度遍历这棵树,把遍历的路径打印出来,就解决了一部分边了,这部分边都是经过两次的,来一次去一次。
剩下的边,就是遍历的时候正在访问的节点与已经访问的节点之间的边,很容易的判断的。同样把这部分路径也打印出来。
后来看了 Discuss 才发现,这个东西叫做“欧拉回路”,又长见识了。
代码
#include <stdio.h>
#define MAX_M 50032
#define MAX_N 10032
int N, M;
struct edge_node {
int vis, to;
struct edge_node *next;
};
struct edge_node edges[MAX_M * 2], *map[MAX_N];
int edges_cnt, vis[MAX_N];
inline void insert(struct edge_node *e, int from, int to)
{
e->to = to;
e->next = map[from];
map[from] = e;
}
void dfs(int idx)
{
struct edge_node *e;
int i;
vis[idx] = 1;
printf("%d\n", idx);
for (e = map[idx]; e; e = e->next) {
i = e - edges;
if (vis[e->to]) {
if (e->vis)
continue;
edges[i].vis = 1;
edges[i ^ 1].vis = 1;
printf("%d\n%d\n", e->to, idx);
continue;
}
edges[i].vis = 1;
edges[i ^ 1].vis = 1;
dfs(e->to);
printf("%d\n", idx);
}
}
int main()
{
int from, to, i;
freopen("e:\\test\\in.txt", "r", stdin);
scanf("%d%d", &N, &M);
for (i = 0; i < M*2; i += 2) {
scanf("%d%d", &from, &to);
insert(&edges[i], from, to);
insert(&edges[i + 1], to, from);
}
dfs(1);
return 0;
}