用python語言實現的最短路spfa演算法

來源:互聯網
上載者:User
最近在學習python,對於一個c系列語言深度中毒的人來說很多問題需要拋棄舊的認識並重新理解

#coding=utf-8global n, m, k, edge, head, dis, stack, vis, nMax, mMax, infnMax = 100mMax = 10000inf = 1e+10class e(object):    passn = 0k = 0m = 0eg = 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    passdef 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,kclass student:    passstu = []def addStudent1(nm ,ag):    global stu,k    stu[k].name = nm    stu[k].age = ag    k+=1    passdef addStudent(nm ,ag):    global stu,k    stu[k].name = nm    stu[k].age = ag    k+=1    passif __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中插入學生資訊的程式。但是運行時候會發現,最後插入的值會覆蓋前面的學生資訊值

列印結果如下

請輸入學生人數3zys20xcy19ghz20輸出結果ghz20ghz20ghz20

把addstudent改為

Python代碼

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

後問題解除

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.