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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。