USACO 3.3 Riding the Fences(欧拉路输出路径)
以前知道白书上的代码,一直不理解,本来以为对欧拉回路定理已经很熟了,就是不明白为什么错,终于对白书上的代码有认识了,就是必须把输出语句给存起来。。不能在函数dfs里输出啊。。。错了N次啊。。为什么要把输出压到栈里,讲解在http://www.nocow.cn/index.php/USACO/fence有提到,貌似是可能存在环的情况,至今不是很明白。
和虎哥讨论了一下,直接把在dfs里直接输出的程序给cha掉了。orz一下。。。
7 1 2 2 3 3 4 4 1 3 5 5 6 6 3
这个数据就是1 2 3 4是一个环,3 5 6也是一个环,到3这个结点时候按字典序查的时候会先搜4,这样就出错了。
PS:以前做过输出图的深度优先搜索遍历,忘记了啊。。。2012.11.29
1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: fence 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cmath> 9 #include <queue> 10 #include <map> 11 using namespace std; 12 int p[501][501],L[501],ans = 1,res[10001]; 13 void dfs(int x) 14 { 15 int i; 16 for(i = 1; i <= 500; i ++) 17 { 18 if(p[x][i]) 19 { 20 p[x][i] --; 21 p[i][x] --; 22 dfs(i); 23 } 24 } 25 res[ans++] = x; 26 return ; 27 } 28 int main() 29 { 30 int n,sv,ev,str,i,z; 31 freopen("fence.in","r",stdin); 32 freopen("fence.out","w",stdout); 33 scanf("%d",&n); 34 for(i = 1; i <= n; i ++) 35 { 36 scanf("%d%d",&sv,&ev); 37 L[sv] ++;L[ev] ++; 38 p[sv][ev] ++; 39 p[ev][sv] ++; 40 } 41 z = 1; 42 for(i = 1; i <= 500; i ++) 43 { 44 if(L[i]%2 == 1) 45 { 46 str = i; 47 break; 48 } 49 if(z&&L[i]) 50 { 51 str = i; 52 z = 0; 53 } 54 } 55 dfs(str); 56 for(i = ans-1;i >= 1;i --) 57 printf("%d\n",res[i]); 58 return 0; 59 }