John's trip 欧拉回路输出路径
来源:互联网 发布:中文域名的作用 编辑:程序博客网 时间:2024/06/08 09:39
/*欧拉回路和欧拉路径的判断欧拉回路:无向图:每个顶点的度数都是偶数,则存在欧拉回路。有向图:每个顶点的入度都等于出度,则存在欧拉回路。欧拉路径:无向图:当且仅当该图所有顶点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。有向图:当且仅当该图所有顶点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1,其 他顶点 出度=入度。*//*用 g[u][e]=v; g[v][e]=u;的方法将点对应的边记录下来。深搜的时候直接输出。很巧妙啊。*/#include <stdio.h>#include <cstring>#include <iostream>using namespace std;int g[50][2000];int vis[2000];int degree[50];int stack[2000];int top;void erlu(int u,int m){ for(int i=1;i<=m;i++) { if(!vis[i]&&g[u][i]) { vis[i]=true; erlu(g[u][i],m); stack[top++]=i; } }}int main(){ int u,v,e,n,m,s; while(scanf("%d%d",&u,&v)==2) { if(u==0&&v==0) break; n=0; m=0; top=1; memset(degree,0,sizeof(degree)); memset(vis,false,sizeof(vis)); memset(g,0,sizeof(g)); scanf("%d",&e); n=max(n,max(u,v)); m=max(m,e); s=min(u,v); degree[u]++; degree[v]++; g[u][e]=v; g[v][e]=u; while(scanf("%d%d",&u,&v)==2) { if(u==0&&v==0) break; scanf("%d",&e); n=max(n,max(u,v)); m=max(m,e); degree[u]++; degree[v]++; g[u][e]=v; g[v][e]=u; } bool ret=false; for(int i=1;i<=n;i++) { if(degree[i]%2==1) ret=true; } if(ret) printf("Round trip does not exist.\n"); else { erlu(s,m); printf("%d",stack[top-1]); for(int i=top-2;i>=1;i--) printf(" %d",stack[i]); printf("\n"); } } return 0;}