欧拉回路

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");
}
原文地址:https://www.cnblogs.com/chenyg32/p/2875240.html