Heim  >  Artikel  >  Backend-Entwicklung  >  Der in der Python-Sprache implementierte SPFA-Algorithmus für den kürzesten Weg

Der in der Python-Sprache implementierte SPFA-Algorithmus für den kürzesten Weg

巴扎黑
巴扎黑Original
2016-12-07 11:31:183192Durchsuche

Ich lerne kürzlich Python. Für jemanden, der stark von der Sprache der C-Serie abhängig ist, gibt es viele Probleme, die aufgegeben und neu verstanden werden müssen

#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])

Lassen Sie uns über die aufgetretenen Probleme sprechen

1 Die Länge der Python-Liste ist nicht festgelegt. Wenn Sie ein Element an einer festen Position lesen müssen, müssen Sie sicherstellen, dass die Position nicht leer ist

2 Python unterstützt nicht „++“ und „num[index++“ in c++ ]“ Diese Schreibweise funktioniert hier nicht

3 Der Eingabetyp int value sollte zuerst eingegeben und dann die Konvertierung mit int erzwungen werden ()

4 Globale Variablen sollten mit global deklariert werden und auch in der Funktion „Use global“-Anweisung

5 Lassen Sie uns über eine sehr seltsame Sache sprechen

'''
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)

Das ist eine einfaches Programm zum Einfügen von Schülerinformationen in die Liste. Beim Ausführen werden Sie jedoch feststellen, dass der zuletzt eingefügte Wert den vorherigen Schülerinformationswert überschreibt

Das Druckergebnis ist wie folgt

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

Ändern Sie addstudent in

Python Code

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

Nachdem das Problem gelöst ist


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn