欧拉回路
attention:
- 如果有多组解,按字典序输出。
- 起点为每组数据所给的第一条边的编号较小的路口
- 每次输出完额外换一行
- 保证连通性
每次输入数据结束后,先用入度判断图是否满足回路的条件。
满足的话跑一遍dfs即可。
需要注意格式。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; template <typename T> inline T min(T &a,T &b) {return a<b ?a:b;} template <typename T> inline T max(T &a,T &b) {return a>b ?a:b;} int mxd,st,to[50][2000],tot,ans[2000],in[50]; bool vis[2000]; inline void dfs(int x){ for(int i=1;i<=mxd;++i) if(!vis[i]&&to[x][i]){ vis[i]=1; dfs(to[x][i]); ans[++tot]=i; } } int main(){ int u,v,w; bool ed=0; while(scanf("%d%d",&u,&v)){ if(!u&&!v){ if(ed) break; bool ok=1; for(int i=1;i<=44;++i) if(in[i]&1) {ok=0; break;} //入度判断 if(ok){ memset(vis,0,sizeof(vis)); dfs(st); while(tot-1) printf("%d ",ans[tot--]); //逆序输出 printf("%d ",ans[tot--]); } else printf("Round trip does not exist. "); memset(in,0,sizeof(in)); memset(to,0,sizeof(to)); ed=1; st=mxd=0; printf(" "); //额外换行 continue; }ed=0; scanf("%d",&w); st= st ? st:min(u,v); mxd=max(mxd,w); to[u][w]=v; ++in[v]; to[v][w]=u; ++in[u]; }return 0; }