• 欧拉回路


    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");
    }
  • 相关阅读:
    CF1461F
    P7114
    CF576D
    CF1208F
    【2021-05-25】碎片化自有碎片化的办法
    【2021-05-23】人生十三信条
    【2021-05-22】人生十三信条
    【2021-05-21】人做成一件事,第一步往往是戒
    【2021-05-20】确认一个人,也就三秒钟的事情
    【2021-05-19】人生十三信条
  • 原文地址:https://www.cnblogs.com/chenyg32/p/2875240.html
Copyright © 2020-2023  润新知