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 }

你可能感兴趣的:(USACO)