1. 程式人生 > >圖搜尋演算法

圖搜尋演算法

1.深度優先遍歷


/* 從v開始深度優先遍歷 */
void Graph::DFSUtil(int v, bool visited[])
{
	// 訪問頂點v並輸出
	visited[v] = true;
	cout << v << " ";
 
	list<int>::iterator i;
 
	for(i=arrive[v].begin(); i!=arrive[v].end(); ++i)
		if(!visited[*i])              // 若鄰接點尚未訪問
			DFSUtil(*i, visited);     // 遞迴
}

堆疊實現形式:

def DFS(self, node0):
        #queue本質上是堆疊,用來存放需要進行遍歷的資料
        #order裡面存放的是具體的訪問路徑
        queue,order=[],[]
        #首先將初始遍歷的節點放到queue中,表示將要從這個點開始遍歷
        queue.append(node0)
        while queue:
            #從queue中pop出點v,然後從v點開始遍歷了,所以可以將這個點pop出,然後將其放入order中
            #這裡才是最有用的地方,pop()表示彈出棧頂,由於下面的for迴圈不斷的訪問子節點,並將子節點壓入堆疊,
            #也就保證了每次的棧頂彈出的順序是下面的節點
            v = queue.pop()
            order.append(v)
            #這裡開始遍歷v的子節點
            for w in self.sequense[v]:
                #w既不屬於queue也不屬於order,意味著這個點沒被訪問過,所以講起放到queue中,然後後續進行訪問
                if w not in order and w not in queue: 
                    queue.append(w)
        return order

 

 

2.廣度優先搜尋

注意廣度優先演算法資料結構使用的是佇列,以佇列的形式先入先出

'''
     readth-First-Search
     BFS是從根節點開始,沿著樹的寬度遍歷樹的節點。如果所有節點均被訪問,則演算法中止。
           廣度優先搜尋的實現一般採用open-closed表。
    '''
    def BFS(self,node0):
        #queue本質上是堆疊,用來存放需要進行遍歷的資料
        #order裡面存放的是具體的訪問路徑
        queue,order = [],[]
        #首先將初始遍歷的節點放到queue中,表示將要從這個點開始遍歷
        # 由於是廣度優先,也就是先訪問初始節點的所有的子節點,所以可以
        queue.append(node0)
        order.append(node0)
        while queue:
            #queue.pop(0)意味著是佇列的方式出元素,就是先進先出,而下面的for迴圈將節點v的所有子節點
            #放到queue中,所以queue.pop(0)就實現了每次訪問都是先將元素的子節點訪問完畢,而不是優先葉子節點
            v = queue.pop(0)
            for w in self.sequense[v]:
                if w not in order:
                    # 這裡可以直接order.append(w) 因為廣度優先就是先訪問節點的所有下級子節點,所以可以
                    # 將self.sequense[v]的值直接全部先給到order
                    order.append(w)
                    queue.append(w)
        return order