【Python排序搜索基本算法】之拓扑排序

        拓扑排序是对有向无环图的一种排序,满足如下两个条件:

1.每个顶点出现且只出现一次;

2.若A在序列中排在B的前面,则在图中不存在从B到A的路径。



如上的无环有向图,v表示顶点:v=['a','b','c','d','e'],e表示有向边:e=[('a','b'),('a','d'),('b','c'),('d','c'),('d','e'),('e','c')],代码如下:

def indegree0(v,e): 
	if v==[]:
		return None
	tmp=v[:]
	for i in e:
		if i[1] in tmp:
			tmp.remove(i[1])
	if tmp==[]:
		return -1

	for t in tmp:
		for i in range(len(e)):
			if t in e[i]:
				e[i]='toDel' #占位,之后删掉
	if e:
		eset=set(e)
		eset.remove('toDel')
		e[:]=list(eset)
	if v:
		for t in tmp:
			v.remove(t)
	return tmp

def topoSort(v,e):
	result=[]
	while True:
		nodes=indegree0(v,e)
		if nodes==None:
			break
		if nodes==-1:
			print('there\'s a circle.')
			return None
		result.extend(nodes)
	return result

v=['a','b','c','d','e']
e=[('a','b'),('a','d'),('b','c'),('d','c'),('d','e'),('e','c')]
res=topoSort(v,e)
print(res)

indegree0函数返回入度为0的顶点,并在v和e中删除它和它相邻的边,如果v列表中没有顶点了,就返回None,如果v列表中还有顶点但是找不到入度为0的顶点,说明有向图中有环,返回-1。topoSort函数不断取出有向图中入度为0的顶点,最后就是拓扑排序序列。输出如下:

['a', 'b', 'd', 'e', 'c']

        考虑一种有环的情况,加上一条c->d的边,如下图所示:


输出如下:

there's a circle.
None

转载请注明:转自 http://blog.csdn.net/littlethunder/article/details/24113193

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
拓扑排序是对有向无环图进行排序的一种算法,它可以找到一种满足所有任务依赖关系的顺序。在Python中,可以使用collections模块中的deque来实现拓扑排序算法。具体实现步骤如下: 1. 统计每个顶点的入度,即每个顶点有多少个前驱节点。 2. 将入度为0的顶点加入队列。 3. 从队列中取出一个顶点,将其加入结果列表中,并移除该顶点及其相关边。 4. 对于该顶点的所有后继节点,将其入度减1,如果入度为0,则将其加入队列。 5. 重复步骤3和4,直到队列为空。 6. 如果结果列表的长度不等于图中顶点的个数,则说明图中存在环,无法进行拓扑排序。 下面是一个示例代码,实现了对一个有向无环图进行拓扑排序: ``` from collections import deque def topological_sort(graph): # 统计每个顶点的入度 in_degree = {v: 0 for v in graph} for v in graph: for neighbor in graph[v]: in_degree[neighbor] += 1 # 将入度为0的顶点加入队列 queue = deque([v for v in graph if in_degree[v] == 0]) # 保存拓扑排序的结果 result = [] while queue: # 取出队列中的顶点 v = queue.popleft() result.append(v) # 移除顶点及其相关边 for neighbor in graph[v]: in_degree[neighbor] -= 1 if in_degree[neighbor] == 0: queue.append(neighbor) # 判断是否存在环 if len(result) != len(graph): raise ValueError("图中存在环,无法进行拓扑排序。") return result # 测试 graph = { 'A': ['B', 'C'], 'B': ['D'], 'C': ['D', 'E'], 'D': ['F'], 'E': ['F'], 'F': [] } try: result = topological_sort(graph) print("拓扑排序结果:", result) except ValueError as e: print(e) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值