题目链接: USACO 3.3.1
题目大意: 给出无向图,可能有重边
输出最小顶点字典序的欧拉通路路径
解题思路: 无向欧拉回路的判断方法,若不存在奇数度点或存在两个奇数度点
则存在欧拉路径,至于重边可以这样处理Edge[a][b]++
PS:欧拉路径的问题要记得判断图是否联通
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 502 int S,E,n,m,edge[MAX][MAX],Du[MAX],ans[2000],k; void DFS(int start) { int i; for(i=S;i<=E;i++) { if(edge[start][i]>=1) { edge[start][i]--; edge[i][start]--; DFS(i); } } ans[++k]=start; } int main() { int i,a,b,start,num; while(scanf("%d",&n)!=EOF) { num=start=k=0; S=0x3f3f3f3f;E=0; memset(edge,0,sizeof(edge)); memset(Du,0,sizeof(Du)); for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); edge[a][b]++; edge[b][a]++; if(a<S) S=a;if(b<S) S=b; if(a>E) E=a;if(b>E) E=b; Du[a]++;Du[b]++; } int pd=0; start=S; for(i=S;i<=E;i++) { if(Du[i]%2==1) { num++; if(start==S&&!pd) start=i,pd=1; } } if(num==0||num==2) DFS(start); else printf("No\n"); for(i=k;i>=1;i--) printf("%d\n",ans[i]); } }