poj 2230详解
2016-08-02 17:35
281 查看
题目链接 : poj2230
大致题意:
有一个人每晚要检查牛场,牛场内有m条路,他担心会有遗漏,就每条路检查两次,且每次的方向不同,要求你打印他行走的路径(必须从1开始),打印一条即可。
思路分析
输入n条边,要求每条边都要走两次,每次的方向不同。那么就可以看成是有向图,把一条边分成两条边,就可以直接打印结果。但是这题还有一个陷阱,m最大为50000,n最大为10000,如果直接采用邻接矩阵数组放不下,那么我的方法就是利用一个动态数组存储结构体。
这样做的优点在于,不可能每个节点都与其他节点连通,毕竟最多只有50000条边,即说明不可能每个G[i].size()都接近10000, 因此利用动态数组可以很好地节约内存。
强烈建议搞懂这里的动态数组的处理方法。
AC代码如下:
如有不当之处欢迎指出!!
大致题意:
有一个人每晚要检查牛场,牛场内有m条路,他担心会有遗漏,就每条路检查两次,且每次的方向不同,要求你打印他行走的路径(必须从1开始),打印一条即可。
思路分析
输入n条边,要求每条边都要走两次,每次的方向不同。那么就可以看成是有向图,把一条边分成两条边,就可以直接打印结果。但是这题还有一个陷阱,m最大为50000,n最大为10000,如果直接采用邻接矩阵数组放不下,那么我的方法就是利用一个动态数组存储结构体。
struct node { int key; //记录边的另一头的值 int ok; //标记这条路是否走过 node(int x,int y); }; vector<node>G[maxn]; //记录每条边的信息
这样做的优点在于,不可能每个节点都与其他节点连通,毕竟最多只有50000条边,即说明不可能每个G[i].size()都接近10000, 因此利用动态数组可以很好地节约内存。
强烈建议搞懂这里的动态数组的处理方法。
AC代码如下:
#include<cstdio> #include<vector> using namespace std; const int maxn=10000+5; struct node { int key; int ok; node(int x,int y); }; node::node(int x,int y) { key=x; ok=y; } vector<node>G[maxn]; void dfs(int u) { int len=G[u].size(); for(int i=0;i<len;i++) { node &temp=G[u][i]; if(temp.ok) { temp.ok=0; dfs(temp.key); } } printf("%d\n",u); } int main() { int n,m; int x,y; scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); G[x].push_back(node(y,1)); G[y].push_back(node(x,1)); } dfs(1); return 0; }
如有不当之处欢迎指出!!
相关文章推荐
- POJ2230 Watchcow——欧拉回路
- poj[2230]Watchcow 深搜 欧拉回路
- POJ 2230 Watchcow【欧拉回路】
- POJ 2230 Watchcow 【欧拉回路】
- poj 2230 Watchcow(欧拉回路)
- POJ 1177 Picture (线段树+离散化+扫描线) 详解
- poj_2230 Watchcow
- POJ 2230 Watchcow(欧拉回路+DFS)
- poj2230 解题报告
- poj[2230]Watchcow 深搜 欧拉回路
- poj 2230 欧拉回路
- POJ 1177 Picture (线段树+离散化+扫描线) 详解
- 【转】POJ 1177 (线段树+离散化+扫描线) 详解
- POJ 2230 (欧拉回路)
- POJ 2230
- 【原】 POJ 3750 小孩报数问题 Joseph相关问题详解 解题报告
- poj 无向图最小环问题 详解,模板
- poj 2230 Watchcow
- POJ 2230 Watchcow 欧拉路径 DFS
- POJ 1151 Atlantis 线段树求矩形面积并 方法详解