题目大意:
给你一幅连通的图,要求从起点1开始走,要经过每条边刚好两次,并且最终回到1起点。
思路:将无向图转换成有向图求欧拉回路。
#include<cstdio> #define N 11000 #define M 110000//由于是将无向图转换成有向图,所以边变为原来的两倍。 //因此*2,这个地方调了好几天,满满的都是泪啊。 int n,m; struct map { int tot; int head[N],v[M],pre[M]; /* pre[]里存的是a点连得另一个点的编号。 v[]存的是当前边连得b点。 */ bool f[M]; void addedge(int a,int b) { tot++; v[tot]=b; pre[tot]=head[a]; head[a]=tot; } }G; void dfs(int now) { for (int p=G.head[now];p;p=G.pre[p]) { if (!G.f[p]) { G.f[p]=1; dfs(G.v[p]); } } printf("%d ",now); } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); G.addedge(a,b); G.addedge(b,a); } dfs(1); return 0; }