题目链接。
分析:
n个点,m条边,每条边仅且经过两次,输出路径。
题目保证了必然存在一条这样的边,那么直接dfs搜索,搜索的时候把next标记下就可以了。
不过虽然参考别人的过了,还是遇到很多问题,要仔细琢磨琢磨了。
#include <stdio.h> #define MAXN 10010 #define MAXM 100010 struct node{ int to; int next; }edge[MAXM]; int head[MAXN], t, vis[MAXM]; void Init(int n, int m){ int i; t = 0; for(i=1; i<=n; i++) head[i] = -1; for(i=0; i<=m*2; i++) vis[i] = 0; } void add(int u, int v){ edge[t].to = v; edge[t].next = head[u]; head[u] = t++; } void euler(int u){ int i; for(i=head[u]; i != -1; i = edge[i].next)if(!vis[i]){ vis[i] = 1; euler(edge[i].to); } printf("%d\n", u); } int main(){ int n, m, i, u, v; scanf("%d %d", &n, &m); Init(n, m); for(i=0; i<m; i++){ scanf("%d %d", &u, &v); add(u, v); add(v, u); } euler(1); return 0; }