思路:
深搜的時(shí)候,可以生成一棵樹(shù)。
深搜也就是深度遍歷這棵樹(shù),把遍歷的路徑打印出來(lái),就解決了一部分邊了,這部分邊都是經(jīng)過(guò)兩次的,來(lái)一次去一次。
剩下的邊,就是遍歷的時(shí)候正在訪問(wèn)的節(jié)點(diǎn)與已經(jīng)訪問(wèn)的節(jié)點(diǎn)之間的邊,很容易的判斷的。同樣把這部分路徑也打印出來(lái)。
后來(lái)看了 Discuss 才發(fā)現(xiàn),這個(gè)東西叫做“歐拉回路”,又長(zhǎng)見(jiàn)識(shí)了。
代碼
#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;
}
