[算法导论]拓扑排序 @ 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 = ‘white‘
            u.pi = None
        global time
        time = 0
        for u in G.V:
            if u.color == ‘white‘:
                self.DfsVisit(G, u)

    def DfsVisit(self, G, u):
        global time
        time = time + 1
        u.d = time
        u.color = ‘gray‘
        for v in u.adj:
            if v.color == ‘white‘:
                self.DfsVisit(G, v)
                v.pi = u
        u.color = ‘black‘
        time = time + 1
        u.f = time

    def TopologicalSort(self, G):
        LinkedList = Vertex(‘#‘)
        self.Dfs(G)
        G.V.sort(key=lambda v:v.f)
        for v in G.V:
            v.next = LinkedList.next
            LinkedList.next = v
        return LinkedList

if __name__ == ‘__main__‘:
    undershorts = Vertex(‘undershorts‘)
    socks = Vertex(‘socks‘)
    pants = Vertex(‘pants‘)
    shoes = Vertex(‘shoes‘)
    belt = Vertex(‘belt‘)
    shirt = Vertex(‘shirt‘)
    tie = Vertex(‘tie‘)
    jacket = Vertex(‘jacket‘)
    watch = Vertex(‘watch‘)

    undershorts.adj = [pants, shoes]
    socks.adj = [shoes]
    pants.adj = [belt, shoes]
    shoes.adj = []
    belt.adj = [jacket]
    shirt.adj = [belt, tie]
    tie.adj = [jacket]
    jacket.adj = []
    watch.adj = []

    G = Graph()
    G.V = [undershorts,socks,pants,shoes,belt,shirt,tie,jacket,watch]

    m = Solution()
    Sort_List = m.TopologicalSort(G)
    p = Sort_List
    while p.next != None:
        print p.next.key, p.next.f
        p = p.next
时间: 2024-10-09 10:46:47

[算法导论]拓扑排序 @ Python的相关文章

算法导论——拓扑排序

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 { /** *

DAG图的拓扑排序 python

在DAG中DFS中顶点的出栈顺序即逆拓扑序. def topological_sort( graph ): is_visit = dict( ( node, False ) for node in graph ) li = [] def dfs( graph, start_node ): for end_node in graph[start_node]: if not is_visit[end_node]: is_visit[end_node] = True dfs( graph, end_n

[算法导论]quicksort algorithm @ Python

算法导论上面快速排序的实现. 代码: def partition(array, left, right): i = left-1 for j in range(left, right): if array[j] <= array[right]: i += 1 array[j], array[i] = array[i], array[j] array[i+1], array[right] = array[right], array[i+1] return i+1 def quicksort(arr

算法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).在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的

算法导论--------------计数排序and基数排序

计数排序假设n个输入元素中的每一个都介于0和k之间的整数,k为n个数中最大的元素.当k=O(n)时,计数排序的运行时间为θ(n).计数排序的基本思想是:对n个输入元素中每一个元素x,统计出小于等于x的元素个数,根据x的个数可以确定x在输出数组中的最终位置.此过程需要引入两个辅助存放空间,存放结果的B[1...n],用于确定每个元素个数的数组C[0...k].算法的具体步骤如下: (1)根据输入数组A中元素的值确定k的值,并初始化C[1....k]= 0: (2)遍历输入数组A中的元素,确定每个元

算法导论------------桶排序算法之研究

举个来说明桶排序的过程,假设现在有A={0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68},桶排序如下所示: 研究过计数排序我们知道了----计数排序是假设输入是由一个小范围内的整数构成,而桶排序则假设输入由一个随机过程产生的,该过程将元素均匀而独立地分布在区间[0,1)上.当桶排序的输入符合均匀分布时,即可以线性期望时间运行.桶排序的思想是:把区间[0,1)划分成n个相同大小的子区间,成为桶(bucket),然后将n个输入数分布到各个桶中去,对

算法导论 计数排序

计数排序的关键就在于如何处理每个元素的最终位置.在计数排序中,我们可以通过维护一个数组C[i]来记录键值为i的元素所属的位置.每次输入一个A[i],首先记录每个A[i]出现的次数C[i],然后从前向后C[i]=C[i-1]+C[i],这样可以得出值为i所在排序后新数组中的最后一个重复数的位置.计数排序的一个显然问题就是C[]数组的大小确定的问题.下面贴上我自己理解写出的代码. #include<iostream> using namespace std; int main() { int n,

[算法导论]强连通分量 @ 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 = [] class Solution: def Dfs(self, G): for u in G.V: u.color = 'white' u.pi = No