poj2367一道利用dfs退栈求拓扑排序的简单题
2012-09-05 21:13
344 查看
拓扑排序:偏序变成全序的过程。
具有自反性,反对称性,传递性的集合叫偏序。
今天翻看数据结构课本上,看到拓扑排序了,有两种方法,一种是找入度为零的点,然后删除相连的变,再找初度为0的点,入栈,知道找不到,另一种是有向无环图时候,可以用dfs退栈的方法,搜到最后的那个点,就是初度为0的点了,即可用一个数组存上,最后倒序输出这个数组就是拓扑排序了,如果有换的情况下,参考算法导论上的染色问题,即可解决,我找了个别人写的模版:
利用dfs的方法就是找搜索树种的回边,利用染色的方法,算法导论上有介绍
我写的代码如下:
初始化:memset(vis,0,sizeof(vis));
对所有vis[i] == 0,调用dfs
bool dfs(int u)
{
if(vis[u] == 1) return false;
if(vis[u] == 2) return true;
vis[u] = 1;
for(i = 0;i < g[u].size();i++) {
if(false == dfs(g[u][i])) {
return false;
}
}
vis[u] = 2;
stack[top++] = u;
return true;
}
下面是我在poj上找的一道题,拿来做个参考。我觉得可以留给考研复习的同学们用,哈哈
Source Code
Source Code
具有自反性,反对称性,传递性的集合叫偏序。
今天翻看数据结构课本上,看到拓扑排序了,有两种方法,一种是找入度为零的点,然后删除相连的变,再找初度为0的点,入栈,知道找不到,另一种是有向无环图时候,可以用dfs退栈的方法,搜到最后的那个点,就是初度为0的点了,即可用一个数组存上,最后倒序输出这个数组就是拓扑排序了,如果有换的情况下,参考算法导论上的染色问题,即可解决,我找了个别人写的模版:
利用dfs的方法就是找搜索树种的回边,利用染色的方法,算法导论上有介绍
我写的代码如下:
初始化:memset(vis,0,sizeof(vis));
对所有vis[i] == 0,调用dfs
bool dfs(int u)
{
if(vis[u] == 1) return false;
if(vis[u] == 2) return true;
vis[u] = 1;
for(i = 0;i < g[u].size();i++) {
if(false == dfs(g[u][i])) {
return false;
}
}
vis[u] = 2;
stack[top++] = u;
return true;
}
下面是我在poj上找的一道题,拿来做个参考。我觉得可以留给考研复习的同学们用,哈哈
Source Code
Problem: 2367 | User: xingkaka | |
Memory: 188K | Time: 0MS | |
Language: C++ | Result: Accepted |
#include<iostream> #include<stdio.h> using namespace std; #include<vector> #define MAZ 105 int vis[MAZ]; int g[MAZ]; int f=0; vector<int>m[MAZ]; void dfs(int v) { if(vis[v])return ; vis[v]=1; for(int i=0;i<m[v].size();i++) { if(!vis[m[v][i]])//这里也可以不写 dfs(m[v][i 4000 ]); } g[f++]=v; } int main() { int n,i,j; scanf("%d",&n); for(i=1;i<=n;i++) { int v; while(scanf("%d",&v)!=EOF&&v!=0) { m[i].push_back(v); } } for(i=1;i<=n;i++) { if(!vis[i]) { dfs(i); } } for(i=f-1;i>=1;i--) printf("%d ",g[i]); printf("%d\n",g[0]); return 0; }
相关文章推荐
- 拓扑排序简单应用poj2367
- 【uva-10305】Ordering Tasks (拓扑排序中最简单的一道
- HDU 1010题解这是一道简单的DFS加回溯题,看懂后就会对递归和回溯有较深刻的理解。
- 利用DFS求解有向图的拓扑排序
- 一天一道简单题目(2)
- 【图灵杯 F】一道简单的递推题(矩阵快速幂,乘法模板)
- 利用IEHelper实现简单网址过滤
- 一道利用汉字的高低字节换位的加密程序
- 利用位操作实现简单的功能
- Unity3D 利用C#实现简单的代理模式Delegate(委托)
- 利用LineDDA函数来实现简单的图片移动动画
- 利用ajax实现简单的注册验证局部刷新实例
- [C]利用蔡勒公式简单实现万年历
- [杜教筛][莫比乌斯反演] LOJ #6229. 这是一道简单的数学题
- HDU 1015 Safecracker(一道很好的dfs)
- Sorting It All Out(简单的拓扑排序)
- 利用Java编写简单的WebService实例
- HDU 1015 Safecracker (很棒的一道DFS)
- nyoj113字符串替换(利用string类的简单方法)
- 4.利用python生成器实现简单的“生产者消费者”模型