圖的廣度優先搜索

經過隊列實現廣度優先搜索算法前端

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

相關文章
相關標籤/搜索