题目大意:问该图中是否存在一条欧拉回路,若存在则输出其路径。
算法思路:存在欧拉回路很好判断,记录下每个点的度,因为是无向图,因此只需要每个点的度都是偶数即可。主要就是输出路径的问题,用普通的递归方法会超时,这里借鉴了网上的思路,详见代码。
#include <iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; int maps[45][2000]; int h,a1,b1; int a,b,num,e,len,sa,se,strcnt,stack_top; bool isOver,visited[2000],isFirst,isGameOver; int degree[45]; int ans[2000]; map<int,int>mp; void dfs(int k) { for (int i = 1; i <= strcnt ;i++) { if (!visited[i] && maps[k][i]) { visited[i] = true; dfs(maps[k][i]); ans[stack_top++] = i; } } } void addNode(int x,int y,int numm) { if(mp.find(x)==mp.end()) { mp[x]=x; } if(mp.find(y)==mp.end()) { mp[y]=y; } maps[x][num]=y; maps[y][num]=x; degree[x]++; degree[y]++; strcnt++; } int main() { while(true) { isGameOver=false; mp.clear(); memset(degree,0,sizeof(degree)); memset(ans,0,sizeof(ans)); memset(maps,0,sizeof(maps)); isOver=isFirst=false; e=1; len=0; strcnt=1; scanf("%d%d",&a,&b); sa=a<b?a:b; if(a==0&&b==0) break; scanf("%d",&num); while(true) { addNode(a,b,num); scanf("%d%d",&a,&b); if(a==0&&b==0) break; scanf("%d",&num); } //printf("%d\n",len); //len=mp.size(); for(int i=1; i<=44; i++) { if((degree[i])%2!=0) { isOver=true; break; } } if(!isOver) { memset(visited,false,sizeof(visited)); stack_top=1; dfs(sa); for(int i=strcnt-1; i>1; i--) { printf("%d ",ans[i]); } printf("%d\n",ans[1]); } else printf("Round trip does not exist.\n"); } return 0; }