每日一算法之拓扑排序

伪代码:

TopLogical(G)
    call DFS to compute finishtime
    as each vertex finished , insert it onto the front of a linked list
  return the linked list of vertices

  

实现如下:

#include <iostream>
#include <vector>
#include <memory>
using namespace std;
vector<vector<int>> graphic;
vector<int> res;
bool *visit;
int length;
void init()
{
	visit = new bool[length];
	cout<<"init:"<<length<<endl;
	for(int i = 0 ; i < length ; ++i)
	{
		visit[i] = false;
	}
}
void Dfs(int cur)
{
	if(visit[cur] )
	{
		return ;
	}
	visit[cur] = true;
	for(int i = 0 ; i < graphic[cur].size() ; ++i)
	{

		Dfs(graphic[cur][i]);
	}
	cout<<"dfs:"<<cur<<endl;
	res.push_back(cur);
}
///void SecondDfs()
//{

//}
int main()
{
	length = 7;
	vector<int> ve;
	init();
	for(int i = 0 ; i < length ; ++i)
	{
		graphic.push_back(ve);
	}
	graphic[0].push_back(1);
	graphic[0].push_back(3);
	graphic[1].push_back(2);
	graphic[1].push_back(3);
	graphic[2].push_back(6);
	graphic[4].push_back(2);
	graphic[4].push_back(5);
	graphic[5].push_back(6);
	for(int i = 0 ; i < length ; ++i)
	{
		Dfs(i);
	}
	for(int i = res.size()-1 ; i >= 0; --i)
	{
		cout<<res[i]<<" ";
	}

	return 0;
}

  

时间: 2024-08-25 01:21:12

每日一算法之拓扑排序的相关文章

算法8-10:最短路径算法之拓扑排序

该算法的基本思想就是按照拓扑排序的顺序依次将每个顶点加入到最短路径树中,每次加入时将该顶点延伸出的所有顶点进行"放松"操作.这种算法的复杂度是E+V. 代码 这种算法的代码比Dijkstra还要简单,代码如下: public class TopologySP extends SP { public TopologySP(EdgeWeightedDigraph G, int s) { super(G, s); // 将所有顶点到原点的距离设为无穷大 // 注意:下面这段代码不要遗漏 fo

有向图算法之拓扑排序

拓扑排序的意思: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列. 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity).在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的

算法导论——拓扑排序

package org.loda.graph; import org.loda.structure.Stack; import org.loda.util.In; /** * * @ClassName: Topological * @Description: 拓扑排序是所有节点dfs的逆后序,也就是每个节点任务完成的时间的逆序排序 * @author minjun * @date 2015年5月24日 下午7:17:53 * */ public class Topological { /** *

[算法导论]拓扑排序 @ Python

class Graph: def __init__(self): self.V = [] class Vertex: def __init__(self, x): self.key = x self.color = 'white' self.d = 10000 self.f = 10000 self.pi = None self.adj = [] self.next = None class Solution: def Dfs(self, G): for u in G.V: u.color =

有向无环图的应用—AOV网 和 拓扑排序

有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林. 在工程计划和管理方面的应用 除最简单的情况之外,几乎所有的工程都可分为若干个称作“活动”的子工程,并且这些子工程之间通常受着一定条件的约束,例如:其中某些子工程必须在另一些子工 程完成之后才能开始.对整个工程和系统,人们关心的是两方面的问题: 一是工程能否顺利进行,即工程流程是否“合理”: 二是

拓扑排序的原理及事实上现

本文将从下面几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法 Kahn算法 基于DFS的算法 解的唯一性问题 实际样例 取材自下面材料: http://en.wikipedia.org/wiki/Topological_sorting http://en.wikipedia.org/wiki/Hamiltonian_path 定义和前置条件: 定义:将有向图中的顶点以线性方式进行排序.即对于不论什么连接自顶点u到顶点v的有向边uv,在最后的排序结果

拓扑排序的原理及其实现

本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法 Kahn算法 基于DFS的算法 解的唯一性问题 实际例子 取材自以下材料: http://en.wikipedia.org/wiki/Topological_sorting http://en.wikipedia.org/wiki/Hamiltonian_path 定义和前置条件: 定义:将有向图中的顶点以线性方式进行排序.即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,

拓扑排序介绍

拓扑排序介绍 拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列. 这样说,可能理解起来比较抽象.下面通过简单的例子进行说明! 例如,一个项目包括A.B.C.D四个子部分来完成,并且A依赖于B和D,C依赖于D.现在要制定一个计划,写出A.B.C.D的执行顺序.这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的. 在拓扑排序中,如果存在一条从顶点A到顶点B的路径,那么在排序结果中B

转:【拓扑排序详解】+【模板】

转自:http://www.cnblogs.com/skywang12345/p/3711489.html 拓扑排序介绍 拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列. 这样说,可能理解起来比较抽象.下面通过简单的例子进行说明! 例如,一个项目包括A.B.C.D四个子部分来完成,并且A依赖于B和D,C依赖于D.现在要制定一个计划,写出A.B.C.D的执行顺序.这时,就可以利用到拓扑