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 }
posted @ 2012-11-23 09:54  Naix_x  阅读(256)  评论(0编辑  收藏  举报