拓扑排序

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

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

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

拓扑排序_第1张图片

进行拓扑排序的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);

你可能感兴趣的:(python,拓扑排序,Topologica)