開篇 用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,