Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有简单输入的拓扑排序结果为;索引器:列表索引超出范围“;_Python_List_Topological Sort - Fatal编程技术网

Python 带有简单输入的拓扑排序结果为;索引器:列表索引超出范围“;

Python 带有简单输入的拓扑排序结果为;索引器:列表索引超出范围“;,python,list,topological-sort,Python,List,Topological Sort,我在学习拓扑排序时遇到了一个问题 打印DAG拓扑排序的Python程序 从集合导入defaultdict #类来表示图形 类图: 定义初始化(自身,顶点): self.graph=defaultdict(list)#包含邻接列表的字典 self.V=顶点#顶点数 #函数将边添加到图形中 def附加值(自身、u、v): self.graph[u].append(v) #topologicalSort使用的递归函数 def topologicalSortUtil(自身、v、访问、堆栈): #将当前节

我在学习拓扑排序时遇到了一个问题

打印DAG拓扑排序的Python程序 从集合导入defaultdict #类来表示图形 类图: 定义初始化(自身,顶点): self.graph=defaultdict(list)#包含邻接列表的字典 self.V=顶点#顶点数 #函数将边添加到图形中 def附加值(自身、u、v): self.graph[u].append(v) #topologicalSort使用的递归函数 def topologicalSortUtil(自身、v、访问、堆栈): #将当前节点标记为已访问。 访问过的,访问过的 #对与该顶点相邻的所有顶点重复 对于自我中的i.图[v]: 如果访问[i]==False: self.topologicalSortUtil(i,已访问,堆栈) #将当前顶点推送到存储结果的堆栈 堆栈插入(0,v) #进行拓扑排序的函数。它使用递归 #topologicalSortUtil() def拓扑端口(自身): #将所有顶点标记为未访问 访问=[False]*self.V 堆栈=[] #调用递归助手函数来存储拓扑结构 #从所有顶点开始逐个排序 对于范围内的i(self.V): 如果访问[i]==False: self.topologicalSortUtil(i,已访问,堆栈) #打印堆栈的内容 打印堆栈 #驱动程序代码 g=图(6) g、 增编(5,2) g、 增补(5,0) g、 增补(4,0) g、 增编(4,1) g、 增编(2,3) g、 增编(3,1) 打印“以下是给定图形的拓扑排序” g、 拓扑排序() 但是,我更改了输入,因为我想测试我的项目所需的实际案例

g=图(5)
g、 增编(1,2);
g、 增编(2,3);
g、 增编(3,4);
g、 增编(4,5);
但是我在递归函数中遇到了一个“列表索引超出范围”异常,我不明白为什么

堆栈跟踪
索引器错误回溯(最近一次调用)
在里面
54
55打印(“以下是给定图形的拓扑排序”)
--->56 g.拓扑排序()
在拓扑排序中(self)
37适用于范围内的i(自身V):
38如果访问[i]==错误:
--->39自拓扑Ortutil(i,已访问,堆栈)
40
41#打印堆栈内容
在topologicalSortUtil中(self、v、visited、stack)
图[v]中的i为21:
22如果访问[i]==错误:
--->23.topologicalSortUtil(i,已访问,堆栈)
24
25#将当前顶点推送到存储结果的堆栈
在topologicalSortUtil中(self、v、visited、stack)
图[v]中的i为21:
22如果访问[i]==错误:
--->23.topologicalSortUtil(i,已访问,堆栈)
24
25#将当前顶点推送到存储结果的堆栈
在topologicalSortUtil中(self、v、visited、stack)
图[v]中的i为21:
22如果访问[i]==错误:
--->23.topologicalSortUtil(i,已访问,堆栈)
24
25#将当前顶点推送到存储结果的堆栈
在topologicalSortUtil中(self、v、visited、stack)
20#对与该顶点相邻的所有顶点重复
图[v]中的i为21:
--->22如果访问[i]==错误:
23.topologicalSortUtil(i,已访问,堆栈)
24
索引器:列表索引超出范围

索引器错误:列表索引超出范围是因为此示例代码假定顶点从零开始编号

已访问的列表
初始化为:

visted=[False]*self.V
因此,如果使用5个顶点初始化图形,则访问的
索引将为0、1、2、3、4

然后,函数
topologicalSortUtil(self,v,visted,stack)
执行下面的第22行,顶点
5
超出范围,因为范围从0到4:

图[v]中i的
21:
--->22如果访问[i]==错误:
23.topologicalSortUtil(i,已访问,堆栈)
下面的代码使用基于零的顶点索引,工作正常

g = Graph(5) 

g.addEdge(0, 1)
g.addEdge(1, 2) 
g.addEdge(2, 3) 
g.addEdge(3, 4)

print("Following is a Topological Sort of the given graph")
g.topologicalSort() 
输出:

下面是给定图形的拓扑排序
[0, 1, 2, 3, 4]
使用任意顶点数的拓扑排序实现 以下实现不需要指定顶点数,因为每当通过
add\u edge
方法将新顶点添加到图形中时,计数会自动增加

此外,顶点不需要以任何特定数字开始。我继续并清理了格式,以使用标准的snake-case命名约定

从集合导入defaultdict
类图:
定义初始化(自):
self.graph=defaultdict(list)#包含邻接列表的字典
def添加_边缘(自身、u、v):
self.graph[u].append(v)
def拓扑_排序(自)->列表:
访问=设置()
反向拓扑=列表()
顶点=集合(self.graph.keys())
对于顶点中的顶点:
如果未访问顶点:
self.\u拓扑\u排序\u util(顶点、访问、反转\u拓扑)
返回列表(反向(反向拓扑))
定义拓扑排序工具(自身、顶点、访问、反向拓扑):
已访问。添加(顶点)
对于自图[vertex]中的adj_顶点:
如果未访问调整顶点:
self.\u拓扑\u排序\u util(调整顶点、访问、反向拓扑)
反向拓扑追加(顶点)
g=图()
g、 添加_边(1,2)
g、 添加_边(2,3)
g、 添加_边(3,4)
g、 添加_边(4,5)
g = Graph(5) 

g.addEdge(0, 1)
g.addEdge(1, 2) 
g.addEdge(2, 3) 
g.addEdge(3, 4)

print("Following is a Topological Sort of the given graph")
g.topologicalSort()