欧拉回路
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"); }
转载请注明出处http://www.cnblogs.com/chenyg32/