POJ2230 Watchcow 欧拉回路[dfs+邻接表]
2011-10-20 13:55
253 查看
思路:很显然是一个欧拉无向图。
因为要遍历每个边两遍而且方向不同。
所以可以看成是有向图来处理。
以下代码是 dfs+邻接表。
这里注意的dfs和普通的dfs不一样在于终止条件。
以前的dfs都是找到某个点后终止,现在是直到遇到某个点,那个点已经无路可走了,再终止。(因为题目已经保证要求的路径存在)
还有就是有些人估计疑惑为什么没用到栈来输出。
其实不用栈的原因很简单,就是欧拉回路的路径是对称。起点终点都是1,你从终点走过来和从起点走过来都是符合题意。
第一次接触欧拉图,还有这题算简单的,一次AC水过。
因为要遍历每个边两遍而且方向不同。
所以可以看成是有向图来处理。
以下代码是 dfs+邻接表。
这里注意的dfs和普通的dfs不一样在于终止条件。
以前的dfs都是找到某个点后终止,现在是直到遇到某个点,那个点已经无路可走了,再终止。(因为题目已经保证要求的路径存在)
还有就是有些人估计疑惑为什么没用到栈来输出。
其实不用栈的原因很简单,就是欧拉回路的路径是对称。起点终点都是1,你从终点走过来和从起点走过来都是符合题意。
第一次接触欧拉图,还有这题算简单的,一次AC水过。
#include<iostream> using namespace std; const int N=10005; const int M=50005; int n,m; int k=1; struct Edge { int v,next,re; bool vis; }edge[2*M]; int edgehead ; void addedge(int from,int to) { edge[k].v=to; edge[k].next=edgehead[from]; edge[k].vis=0; edge[k].re=k+1; edgehead[from]=k; k++; edge[k].v=from; edge[k].vis=0; edge[k].re=k-1; edge[k].next=edgehead[to]; edgehead[to]=k; k++; } void dfs(int now) { for(int i=edgehead[now];i;i=edge[i].next) { if(!edge[i].vis)//这个深搜的终止条件是每个边都结束了。 { edge[i].vis=true; dfs(edge[i].v); } } printf("%d\n",now); } void solve() { dfs(1); } int main() { scanf("%d%d",&n,&m); int from,to; for(int i=1;i<=m;i++) { scanf("%d%d",&from,&to); addedge(from,to); } solve(); return 0; }
相关文章推荐
- POJ2230 Watchcow 欧拉回路[dfs+邻接表]
- POJ2230 Watchcow(欧拉回路 + dfs)
- poj2230 dfs 欧拉回路
- poj2230 Watchcow(欧拉回路:输出点轨迹)
- POJ2230 Watchcow 【欧拉回路】+【DFS】
- POJ2230 Watchcow——欧拉回路——Pku2230
- POJ2230 Watchcow(欧拉回路)
- POJ 2230 Watchcow (欧拉路径 dfs 邻接表)
- 图的邻接表和DFS遍历
- 欧拉回路 + 数据结构 + dfs
- poj 2230 Watchcow(欧拉回路)
- 数据结构与C语言实现(九)——图(上):邻接表,DFS与BFS
- 邻接表和邻接矩阵手写简洁代码DFS BFS
- DFS--深度优先搜索--图的邻接表表示
- poj 2230 Watchcow(有向图的欧拉回路)
- Poj 2230 Watchcow【欧拉回路】
- 邻接表存储图,DFS遍历图的java代码实现
- 图的邻接矩阵和邻接表存储的深度优先遍历(DFS)算法实现
- bzoj 2783 树(dfs 前缀和 邻接表)(中等)
- BZOJ 3033 太鼓达人(DFS+欧拉回路)