拓扑排序

来源:互联网 发布:邓肯数据统计历史排名 编辑:程序博客网 时间:2024/05/22 09:44

在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting)。

  • 每个顶点出现且只出现一次;
  • 若A在序列中排在B的前面,则在图中不存在从B到A的路径。

也可以定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。

ss

进行拓扑排序的python代码:

class Node:  def __init__(self,id,in_node,out_node):    self.id = id;    self.in_node = in_node;    self.out_node = out_node;list = [];list.append(Node(0,[2],[6,1,5]));list.append(Node(1,[0],[]));list.append(Node(2,[],[0,3]));list.append(Node(3,[2],[5]))list.append(Node(4,[5,6],[]))list.append(Node(5,[0,3],[4]))list.append(Node(6,[0,7],[9,4]))list.append(Node(7,[8],[6]))list.append(Node(8,[],[7]))list.append(Node(9,[6],[10,11,12]))list.append(Node(10,[9],[]))list.append(Node(11,[9],[12]))list.append(Node(12,[9,11],[]))def find_in_empty_node(list):  for node in list:    if(len(node.in_node) == 0):      return node;  return None;def find_node(list,id):  for node in list:    if(node.id == id):      return node;def tidy_list(list):  for node in list:    for sub_node in node.in_node:      if(find_node(list,sub_node) == None):        node.in_node.remove(sub_node)while(1):  node = find_in_empty_node(list);  if(None == node):    break;  print node.id;  list.remove(node);  tidy_list(list);
0 0