>  기사  >  백엔드 개발  >  Python 언어로 구현된 최단 경로 spfa 알고리즘

Python 언어로 구현된 최단 경로 spfa 알고리즘

巴扎黑
巴扎黑원래의
2016-12-07 11:31:183202검색

최근 파이썬을 배우고 있는데 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])

발생하는 문제에 대해 이야기해보자.

1 Python 목록의 길이는 고정되어 있지 않습니다. 고정된 위치에서 요소를 읽어야 하는 경우 해당 위치가 비어 있지 않은지 확인해야 합니다

2 Python은 "++" 및 "num[index++" in c++ ]"를 지원하지 않습니다. 이 방법은 여기서는 작동하지 않습니다

3 입력 유형 int 값을 먼저 입력한 다음 int로 강제 변환해야 합니다. ()

4 전역 변수는 전역으로 선언해야 하고 함수에서도 전역 선언을 사용해야 합니다. 전역 문을 사용하세요

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)

목록에 학생 정보를 삽입하는 간단한 프로그램입니다. 그런데 실행하면 마지막에 삽입한 값이 이전 학생 정보 값을 덮어쓰는 것을 볼 수 있습니다

인쇄 결과는 다음과 같습니다

请输入学生人数3
zys
20
xcy
19
ghz
20
输出结果
ghz
20
ghz
20
ghz
20

addtudent를

Python으로 변경 코드

def addStudent(nm ,ag):  
    global stu,k  
    s = student()  
    s.name = nm  
    s.age = ag  
    stu.append(s)  
    k+=1  
    pass

문제 해결 후


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.