1. 程式人生 > >開篇 用python寫的深度優先連結串列遞迴遍歷

開篇 用python寫的深度優先連結串列遞迴遍歷

深度優先遞迴變遍歷,用連結矩陣的方法

   源程式如下:

# -*- coding: cp936 -*-
#程式實現了圖的深度優先遞迴遍歷,用連結矩陣的方法,所用語言python
visited=[]#全域性連結串列變數,用以標識頂點被訪問過與否
depth=[]#全域性變數連結串列用以存放深度優先遍歷結果
class graph:#定義一個圖的類,變數依次包括頂點個數,邊數,存放頂點的連結串列,存放邊的矩陣
    def __init__(self):
        
        self.Vnum=0
        self.Enum=0
        self.aList=[]
        self.matrix=[[]]
        
        
def DFS(a,ii):   #深度優先遍歷遞迴函式,呼叫本身實現遍歷      
  
  jj=0
  visited[ii]=1
  
  depth.append(a.aList[ii])
  #print a.aList[ii]
  for jj in range (a.Vnum):
      if a.matrix[ii][jj]==1  and visited[jj]==0:#若哪個頂點(jj)與ii頂點的在連線矩陣中下標一致的值是1的話,就訪問這個jj點,把它的標記改為1
        DFS(a,jj)
      
    




def DFSTra(a):
   
   ii=0
   for ii in range (a.Vnum):
       visited[ii]=0#將所有頂點標記為未訪問過
   for ii in range (a.Vnum):#從第0個頂點開始訪問
       if visited[ii]==0:
          
          DFS(a,ii)
   
 #主函式 
         
if __name__ == '__main__':
    ii=0
    k=0
    t=0
    a=graph()#定義圖的一個物件
    integer1=raw_input("Enter the num of V:")#頂點數
    a.Vnum=int(integer1)
    print "Enter the num of E:"#邊數
    a.Enum=int(raw_input())
    a.matrix= [[0] * a.Vnum for row in range(a.Vnum)]#二維矩陣定義,以便給每個矩陣元素賦值
    print "輸入各個頂點:"#輸入各個頂點名稱
    for ii in range(a.Vnum):
        char1=raw_input()
        a.aList.append(char1)
    print a.aList,
    for ii in range(a.Vnum):#把所有頂點置為未訪問過
        integer=0
        visited.append(integer)
    print " "
    print "V-to-V:"#以頂點對來表示邊
    for i in range (a.Enum):#整個for迴圈,是用矩陣下標的方式把每條邊表示出來
      j=0
      char1=raw_input()
      #print "char1=",char1#測試
      char2=raw_input()
      for j in range (a.Vnum):#找到一條邊的第一個點在連結串列中的下標,並且賦給k
        if char1==a.aList[j]:
           k=j
           #print "k=",k#測試
           break
        else:
           continue
      j=0
      
      for j in range (a.Vnum):#找到一條邊的第二個點在連結串列中的下標,並且賦給t
        if char2==a.aList[j]:
           t=j
           #print"t=",t#測試
           break
        else:
           continue 
      a.matrix[k][t]=1
      a.matrix[t][k]=1#把以相連的兩個點(第t個值和第k個值)為下標的矩陣值置為1,真
      print (a.aList[k],a.aList[t])
      #aa=0
      #bb=0
    #for aa in range(a.Vnum):#測試矩陣的輸出值,發現輸出不對,注意第39行二維矩陣定義
     #   for bb in range(a.Vnum):
      #     print(a.matrix[aa][bb])
       # print ","


    #DFS(a,0)
    print "深度優先遍歷連結串列遍歷結果為:"   
    DFSTra(a)#進行深度優先遍歷
    print depth,