經過隊列實現廣度優先搜索算法前端
MAXSIZE=10 #定義隊列的最大容量 front=-1 #指向隊列的前端 rear=-1 #指向隊列的末尾 class Node: def __init__(self,x): self.x=x #頂點數據 self.next=None #指向下一個頂點的指針 class GraphLink: def __init__(self): self.first=None self.last=None def my_print(self): current=self.first while current!=None: print('[%d]' %current.x,end='') current=current.next print() def insert(self,x): newNode=Node(x) if self.first==None: self.first=newNode self.last=newNode else: self.last.next=newNode self.last=newNode #隊列數據的存入 def enqueue(value): global MAXSIZE global rear global queue if rear>=MAXSIZE: return rear+=1 queue[rear]=value #隊列數據的取出 def dequeue(): global front global queue if front==rear: return -1 front+=1 return queue[front] #廣度優先查找法 def bfs(current): global front global rear global Head global run enqueue(current) #將第一個頂點存入隊列 run[current]=1 #將遍歷過的頂點設置爲1 print('[%d]' %current, end='') #打印出該遍歷過的頂點 while front!=rear: #判斷當前的隊伍是否爲空 current=dequeue() #將頂點從隊列中取出 tempnode=Head[current].first #先記錄當前頂點的位置 while tempnode!=None: if run[tempnode.x]==0: enqueue(tempnode.x) run[tempnode.x]=1 #記錄已遍歷過 print('[%d]' %tempnode.x,end='') tempnode=tempnode.next #聲明圖的邊線數組 Data=[[0]*2 for row in range(20)] Data =[[1,2],[2,1],[1,3],[3,1],[2,4], \ [4,2],[2,5],[5,2],[3,6],[6,3], \ [3,7],[7,3],[4,5],[5,4],[6,7],[7,6],[5,8],[8,5],[6,8],[8,6]] run=[0]*9 #用來記錄各頂點是否遍歷過 queue=[0]*MAXSIZE Head=[GraphLink]*9 print('圖的鄰接表內容:') #打印圖的鄰接表內容 for i in range(1,9): #共有8個頂點 run[i]=0 #把全部頂點設置成還沒有遍歷過 print('頂點%d=>' %i,end='') Head[i]=GraphLink() for j in range(20): if Data[j][0]==i: #若是起點和鏈表頭相等,則把頂點加入鏈表 DataNum = Data[j][1] Head[i].insert(DataNum) Head[i].my_print() #打印圖的鄰接標內容 print('廣度優先遍歷的頂點:') #打印廣度優先遍歷的頂點 bfs(1) print()