zoukankan      html  css  js  c++  java
  • poj2230 Watchcow【欧拉回路】【输出路径】(遍历所有边的两个方向)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4392

    题目大意:

    一个图,要将每条边恰好遍历两遍,而且要以不同的方向,还要回到原点。

    dfs解法                   借鉴于->大佬博客

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    #define arrsize 10001
    int n, m;
    
    typedef struct edge
    {
        int end;                //代表该边的终点
        bool vis;
    };
    
    vector<edge>arr[arrsize];                  //arrsize代表的是起点
    
    void dfs(int cur)
    {
        for (int i = 0; i < arr[cur].size(); i++)
        {
            if (!arr[cur][i].vis)
            {
                arr[cur][i].vis = true;
                dfs(arr[cur][i].end);                  //因为只需要输出一条路径,所以不需要给dfs增加回溯功能   即不需要在下一行加上arr[cur][i].vis = false;
            }
        }
        cout << cur << endl;              //这里有一点疑问,如果每次都是输出每一条边的起点,那按理来说应该不能输出最后的那个1啊??
    }
    
    int main()
    {
        int i, j;
        while (cin >> n >> m)
        {
            for (i = 0; i < m; i++)
            {
                edge temp;
                int a, b;
                cin >> a >> b;
                temp.end = b;                            //构造两点之间的无向通路
                temp.vis = false;
                arr[a].push_back(temp);
                temp.end = a;
                temp.vis = false;
                arr[b].push_back(temp);
            }
            dfs(1);
            for (i = 1; i <= n; i++)arr[i].clear();              //清空每一个顶点对应的有向边,即清除所有的边,防止对下一组数据造成影响
        }
        return 0;
    }

    2018-04-06


    作者:is_ok
    出处:http://www.cnblogs.com/00isok/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    如何使用SQL语句 查看存储过程的内容
    sl第一篇
    winForm连接数据库(sqlserver2005)
    Format
    dual使用
    ThreadLocal与事务
    oracle中的常用函数
    Oracle中merge into的使用
    API设计中token的思路
    SVN常用功能
  • 原文地址:https://www.cnblogs.com/00isok/p/8729485.html
Copyright © 2011-2022 走看看