最近在学习python,对于一个c系列语言深度中毒的人来说很多问题需要抛弃旧的认识并重新理解
#coding=utf-8 global n, m, k, edge, head, dis, stack, vis, nMax, mMax, inf nMax = 100 mMax = 10000 inf = 1e+10 class e(object): pass n = 0 k = 0 m = 0 eg = e() edge = [] head = [0] dis = [0] stack = [0] vis = [0] def addedge(a, b, c): global k, edge, head ed = e() ed.u = a #you can delect it ed.v = b ed.w = c ed.next = head[a] edge.append(ed) head[a]=k k+=1 pass def spfa(): global n, m, k, edge, head, dis, stack, vis,inf i = top = 0 for i in range(0 , n): dis[i] = inf vis[i] = 0 dis[0] = 0 vis[0] = 1 top+=1 stack[top] = 0 while(top!=0): u = stack[top] top-=1 i = head[u] while(i!=0): v = edge[i].v if dis[v] > dis[u]+edge[i].w: dis[v] = dis[u]+edge[i].w if(vis[v]==0): vis[v] = 1 top+=1 stack[top] = v i = edge[i].next vis[u] = 0 pass if __name__ == '__main__': u = v = l = i = 0 for i in range(0,nMax): head.append(0); dis.append(0) vis.append(0) stack.append(0) while(1): na = input() n = int(na) ma = input() m = int(ma) edge=[0] k = 1 for i in range(0,n): head[i] = 0 for i in range(0,m): ua = input() va = input() la = input() u = int(ua) v = int(va) l = int(la) addedge(u,v,l) spfa() for i in range(1,n): print(dis[i])
说一说遇到的问题吧
1python列表的长度不固定,当需要读取固定位置的元素时要确定那个位置非空
2python不支持“++”,c++中“num[index++]”这种写法在这里行不通
3输入int类型的值应该先input再用int()强制转换
4全局变量要用global申明,并在函数中也要用global申明
5说一个很邪门的事情
''' Created on 2014年7月5日 @author: bbezxcy ''' global stu,k class student: pass stu = [] def addStudent1(nm ,ag): global stu,k stu[k].name = nm stu[k].age = ag k+=1 pass def addStudent(nm ,ag): global stu,k stu[k].name = nm stu[k].age = ag k+=1 pass if __name__ == '__main__': num = 0 k = 0 strn = input("请输入学生人数") num = int(strn) ss = student() for i in range(0 ,num): stu.append(ss) for i in range(0 ,num): nm = input() ag = input() addStudent(nm ,ag) for i in range(0,num): print(stu[i].name) print(stu[i].age)
这是一个简单的向list中插入学生信息的程序。但是运行时候会发现,最后插入的值会覆盖前面的学生信息值
打印结果如下
请输入学生人数3 zys 20 xcy 19 ghz 20 输出结果 ghz 20 ghz 20 ghz 20
把addstudent改为
def addStudent(nm ,ag): global stu,k s = student() s.name = nm s.age = ag stu.append(s) k+=1 pass
后问题解除
相关推荐
在本篇文章中,我们将深入探讨SPFA算法的基本原理、代码实现及其应用。 #### 基本原理 SPFA算法的核心思想在于减少顶点被松弛操作的次数,避免重复松弛相同顶点,从而提高效率。在SPFA中,每个顶点至多进入队列一...
SPFA(Shortest Path Faster Algorithm)是一种高效的单源最短路算法,广泛应用于图论和动态规划等领域。下面是对SPFA算法的详细介绍和优化。 基本实现 SPFA算法的基本思想是通过relax操作来更新节点的距离值。...
在Java实现SPFA算法时,主要涉及的数据结构包括队列(可以使用LinkedList实现)、图(可以使用邻接矩阵或邻接表表示)以及节点的状态(如距离、是否在队列中等)。下面是一个简单的Java代码框架: ```java import ...
与Dijkstra算法不同,SPFA可以处理边权为负值的情况,但不保证找到的是全局最优解,而是局部最优解。** **算法原理:** SPFA算法基于队列数据结构,通过松弛操作不断更新节点到源点的距离。其核心思想是每次从队列...
队列优化的Bellman-Ford最短路算法(SPFA,Shortest Path Faster Algorithm)是一种在图论中用于寻找有向图中单源最短路径的算法,它是在经典Bellman-Ford算法基础上进行优化得到的。Bellman-Ford算法本身能够处理...
最短路SPFA算法。SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法。存在负权边时使用。
在实际实现SPFA算法时,通常会使用一个队列(如双端队列或简单链式队列)和一个标记数组,用于记录顶点是否在队列中。图通常以邻接表的形式存储,以便快速访问每个顶点的邻接点。以下是SPFA算法的伪代码: ``` ...
SPFA算法 此处为SPFA算法详解 用dis数组记录源点到有向图上任意一点距离,其中源点到自身距离为0,到其他点距离为 INF。将源点入队,并重复以下步骤: 1、队首x出队 2、遍历所有以队首为起点的有向边(x,i),若...
SPFA(Shortest Path Faster Algorithm)是一种单源最短路径算法,它的性能非常好,代码实现也并不复杂。特别是当图的规模大,用邻接矩阵存不下的时候,用 SPFA 则可以很方便地面对临接表。每个人都写过广搜,SPFA ...
基本思想 用一个队列来进行维护。初始时将源加入队列。每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。...d[i]:起点s到i的临时最短路长度 松驰的结果是使j的d值减小
- SPFA算法主体:`spfa()`函数实现了整个SPFA算法的过程,包括队列操作、距离更新以及负权回路检测。 #### 六、总结 SPFA算法作为单源最短路径算法的一种高效实现,特别适用于处理含有负权边的图。相比于其他经典...
现在网上有很多最短路径的算法,C++版本的较多,java可用的demo较少,或者不支持双向的,这里总结了java版的spfa算法,个人认为此算法比较实用(拓扑、GIS定位等项目上),本算法支持双向,有兴趣的可以下载下来研究...
SPFA算法 C++实现,使用邻接表存图
但是,该算法也存在一些缺点,如算法的描述中所示,SPFA算法的实现需要使用队列来维护需要更新的点,这可能会增加算法的时间复杂度。 在实际应用中,SPFA算法可以用于解决许多实际问题,如交通网络中的最短路径问题...
SPFA算法就解决了重复计算的问题,在大数据面前大大减少运行时间 该算法改善的思想是避免顶点进行无效的重复更新,对有待更新的顶点移入队列,已更新的顶点移出队列,避免待更新的顶点中存在重复顶点
总结来说,SPFA算法是求解带负权边图的最短路径的一种高效方法,虽然在最坏情况下可能不如Bellman-Ford算法稳定,但通常在实践中表现出更好的性能。理解这两种算法的原理和实现细节对于解决图论问题和参加编程竞赛都...
- 《最短路径 之 SPFA算法.txt》和《SPFA算法.txt》可能包含算法的具体代码实现和相关讨论。 这些文档的结合,为读者提供了全面了解和掌握SPFA算法的理论基础、优化技巧以及实际应用场景的宝贵资源。通过深入学习...
`SPFA算法.cpp`源代码文件很可能实现了SPFA算法的上述优化策略,而`SPFA算法.exe`则是编译后的程序,可以直接运行来寻找图中指定起点到其他所有点的最短路径。通过理解SPFA算法的原理和优化方法,我们可以更好地利用...