hihoCoder #1181: 欧拉路·二 (输出路径)

 

 

题意:提供一个图,要求找出欧拉路的路径(任意合法的路径均可,保证图肯定有欧拉路)。

思路:深搜的过程中删除遍历过的边,并在回溯时打印出来。在深搜时会形成多个环路,每个环都有一个或多个结点与其他环相扣,这样就可以产生欧拉路。

 

 1 #include <bits/stdc++.h>

 2 using namespace std;

 3 const int N=1005;

 4 int n, m, a, b;

 5 vector< vector<int> > vect;//邻接表

 6 void fleury(int t)

 7 {

 8     while(!vect[t].empty())

 9     {

10         int p=vect[t][0];

11         vect[t].erase(vect[t].begin());

12         for(int j=0; j<vect[p].size(); j++)//无向图,两边都要删

13         {

14             if(vect[p][j]==t)

15             {

16                 vect[p].erase(vect[p].begin()+j);

17                 break;  //只删一个

18             }

19         }

20         fleury(p);

21     }

22     printf("%d ", t);//回溯时打印

23 }

24 int main()

25 {

26     //freopen("e://input.txt", "r", stdin);

27     scanf("%d%d", &n, &m);

28     vector<int> tmp;

29     for(int i=0; i<=n; i++) vect.push_back(tmp);

30     for(int i=0; i<m; i++)

31     {

32         scanf("%d%d", &a, &b);

33         vect[a].push_back(b);

34         vect[b].push_back(a);

35     }

36 

37     int i=1;

38     while(i<n && !(vect[i].size()&1)) i++;//找到一个奇数为起点,没奇数则以n为起点

39     fleury(i);

40 

41     return 0;

42 }
AC代码

 

你可能感兴趣的:(code)