求欧拉回路的路径(usaco3.3Riding the Fences)

 1 #include <cstdio>

 2 #include <iostream>

 3 using namespace std;

 4 const int Ni = 505;

 5 const int n = 500;

 6 int eg[Ni][Ni];

 7 int deg[Ni],pos;

 8 int path[Ni*5];

 9 void dfs(int s)

10 {

11     if(deg[s])

12         for(int i=1;i<=n;i++) if(eg[s][i])

13         {

14             eg[s][i]--;

15             eg[i][s]--;

16             deg[s]--;

17             deg[i]--;

18             dfs(i);

19         }

20     path[++pos]=s;

21 }

22 int main()

23 {

24     int i,s,m,u,v;

25     while(~scanf("%d",&m))

26     {

27         pos=-1;

28         for(i=0;i<m;i++)

29         {

30             scanf("%d%d",&u,&v);

31             deg[u]++;deg[v]++;

32             eg[u][v]++;

33             eg[v][u]++;

34         }

35         for(i=1;i<=n;i++) if(deg[i])

36         {s=i;break;}

37         for(;i<=n;i++) if(deg[i]&1)

38         {s=i;break;}

39         dfs(s);

40         for(i=pos;i>0;i--)

41             printf("%d ",path[i]);

42         printf("%d\n",path[0]);

43     }

44     return 0;

45 }

46 /*

47 6

48 1 2

49 1 3

50 2 3

51 2 4

52 2 5

53 4 5

54 ans

55 1 2 4 5 2 3 1

56 */

 

你可能感兴趣的:(USACO)