我这个只是模板啦。。。用的fleury算法。。。
当然也可以DFS求路径。。。原理感觉一样,只不过这更高效吧。。
#include<cstdio> #include<cstring> int n,m; int e[100][100]; int top; int stack[100]; void dfs(int x){ top ++; stack[top] = x; for(int i = 1; i <= n; i ++){ if(e[x][i] > 0){ e[i][x] = e[x][i] = 0;//删除此边 dfs(i); break; } } } void fleury(int x){ top = 0; stack[top] = x; while(top >= 0){ int b = 0; for(int i = 1; i <= n; i ++){ if(e[stack[top]][i] > 0){ b=1; break; } } if(b == 0){//如果没有可以扩展就输出并出栈 printf("%d->",stack[top]); top--; } else{ top--; dfs(stack[top+1]); } } puts(""); } int main() { int degree, num, start;//顶点的度,奇度顶点个数,欧拉回路的起点 while(~scanf("%d%d", &n, &m)){ memset(e, 0, sizeof(0)); for(int i = 0; i < m; i ++){ int s, t; scanf("%d%d", &s, &t); e[s][t] = e[t][s] = 1; } num = 0, start = 1; //如果存在奇度顶点,则从奇度顶点出发,否则从顶点0出发 for(int i = 1; i <= n; i ++){ degree = 0; for(int j = 1; j <= n; j ++){ degree += e[i][j]; } if(degree%2) start = i, num++; } if(num == 0||num == 2) fleury(start); else puts("no"); } return 0; } /* 9 14 1 2 1 8 2 3 2 8 2 9 3 4 4 5 4 6 4 9 5 6 6 7 6 9 7 8 8 9 7 11 1 5 1 4 7 3 7 5 7 6 7 2 5 6 5 2 4 2 4 3 4 6 */
遗憾的是,我做POJ上一个题的时候没有做出来。。。这几天也不想再去想那个题了,那是个好题,过一阵子再去自己写出来吧