1. 程式人生 > >[資料結構]貪婪演算法(Dijkstra Algorithm)

[資料結構]貪婪演算法(Dijkstra Algorithm)

下週要期末考了,好虛啊=_=

複習一波資料結構發現最後一章居然還有兩個演算法沒看再見

所以順道把貪婪和最小生成樹看一下~

這篇就只講貪婪演算法啦,一會再開一篇。

一、貪婪演算法簡介

貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。

通過區域性的最優解去合成最後的最優解。

二、貪婪演算法求解最短路徑演算法描述:

準備:建立兩個陣列,分別存放當前條件下的最優解和已訪問節點

1、初始化:將最優解置為無窮大,已訪問節點陣列置空,將起點的最優解置為0,並調為已訪問

2、尋找最優解:遍歷最優解陣列,找出最優解,並將該點放置到已訪問佇列中

3、更新最優解:從2中的最優解出發,對最優解陣列進行更新(如果從當前最優解出發到各個頂點的距離更優,則更新)

4、重複2.3兩步,直至待訪問佇列為空

演算法結束。

三、圖解







四、實現程式碼:

噗,程式碼不是我的,直接copy教案了

template <class Weight, int graph_size>
void Digraph<Weight, graph_size> :: set_distances(Vertex source,
Weight distance[]) const
/* Post: The array distance gives the minimal path weight from vertex source to each vertex of the Digraph. */
{ 
	Vertex v, w;
	bool found[graph_size]; // Vertices found in S
	for (v = 0; v < count; v++) {
		found[v] = false;
		distance[v] = adjacency[source][v];
	}
	found[source] = true; // Initialize with vertex source alone in the set S.
	distance[source] = 0;
for (int i = 0; i < count; i++) { // Add one vertex v to S on each pass.
	Weight min = infinity;
	for (w = 0; w < count; w++) if (!found[w])
		if (distance[w] < min) {
			v = w;
			min = distance[w];
		}

	found[v] = true;
	for (w = 0; w < count; w++) if (!found[w])
		if (min + adjacency[v][w] < distance[w])
			distance[w] = min + adjacency[v][w];
	}
}

以上。對了,這裡還差一個如何把最短路徑的路徑輸出來還沒有解決,改天閒下來更新一下。