欧拉回路

View Code
/*

【题目来源】

http://poj.org/problem?id=2230

【题目分析】

输入顶点数n,边数m,输入m条边,无向图,从顶点1出发,每条边正反向走1次,求点的遍历顺序。多个答案输出一个就行。

【思路分析】

欧拉回路问题。

总结,求解欧拉回路方法:

构造邻接表,从顶点1开始,以点深搜,搜到不能再搜,搜到天荒地老,最后输出点既是欧拉回路。(当然也可以用链式前向星)

*/

#include <iostream>

#include <vector>

using namespace std;



#define Max 10001



vector<int> v[Max];



void dfs(int now)

{

    while (v[now].size())

    {

        int next = v[now].back();

        

        v[now].pop_back();

        

        dfs(next);

    }

    

    cout << now << endl;//放到while前面就会错。。我也不知道为什么 

}



int main()

{

    int n, m;

    

    cin >> n >> m;

    

    int temp1, temp2;

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

    {

        cin >> temp1 >> temp2;

        

        v[temp1].push_back(temp2);

        

        v[temp2].push_back(temp1);

    }

    

    dfs(1);

    

//    system("pause");

}

下面是链式前向星的做法,比较繁琐。

View Code
#include <iostream>

using namespace std;



#define Max 50000



//链式前向星 

//该点的第一条边 

int head[Max];



struct Edge

{

    int to;//该边的终点 

    

    int next;//该点对应的下一条边 

};



Edge edge[2*Max];



bool vis[2*Max];



void dfs(int now)

{

    for (int i = head[now]; i != -1; i = edge[i].next)

    {

        if (!vis[i])

        {

            vis[i] = true;

            

            dfs(edge[i].to);

            

            cout << edge[i].to << endl; 

        }

    }

}



int main()

{

    int n, m;

    

    cin >> n >> m;

    

    memset(head, -1, sizeof(head));

    

    memset(vis, 0, sizeof(vis));

    

    int temp1, temp2;

    for (int i = 0; i < 2*m; i+=2)

    {

        cin >> temp1 >> temp2;

        

        edge[i].to = temp2;

        

        edge[i].next = head[temp1];

        

        head[temp1] = i;

        

        edge[i+1].to = temp1;

        

        edge[i+1].next = head[temp2];

    

        head[temp2] = i+1;

    }

    

    dfs(1);

    

    cout << 1 << endl;//这种方法会漏掉终点,补上。 

    

    //system("pause");

}

 

你可能感兴趣的:(欧拉回路)