uva10054-The Necklace(项链)
图的判断欧拉回路+输出路径
回路的判定要从度和连通两方面判定(但此题测试数据水的很,我只写了个度的判定)
路径输出一定要后序压栈输出(就是后序遍历一下)先序不行的哦!!!
举个反例
自己先走路径1,再走路径2,先序和后序分别试一下,差不多就知道为什么要后序输出路径了
我的代码如下:
#include <stdio.h> #include <string.h> int G[55][55]; int du[55]; void dfs(int x) { for(int i=50;i>=0;i--) if(G[x][i]) { G[x][i]--; G[i][x]--; dfs(i); printf("%d %d\n",i,x); } } void output() { for(int i = 1; i <= 50; i++) if(!du[i])continue; else dfs(i); } int main () { int t, n, front, rear, flag, count= 0; scanf("%d",&t); while(t--) { memset(du,0,sizeof(du)); memset(G,0,sizeof(G)); flag = 0; scanf("%d",&n); while(n--) { scanf("%d%d",&front,&rear); du[front]++, du[rear]++; G[front][rear]++, G[rear][front]++; } printf("Case #%d\n", ++count); for(int i = 1; i <= 50; i++) if(du[i]%2){puts("some beads may be lost"); flag = 1; break;} if(!flag)output(); if(t)puts(""); } return 0;