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

 

posted @ 2018-04-06 23:51  悠悠呦~  阅读(277)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end