數據結構與算法16:最小生成樹普利姆prim算法

數據結構與算法16:普利姆prim算法

    Prim算法是一個計算圖的最小生成樹的算法。圖的最小生成樹指的是一個圖中去掉一些邊,使得剩餘的邊仍然保持連通,包含全部的點,並且權值之合最小。經過這樣的處理後得到的肯定是一顆樹。

    Prim算法和Dijkstra算法有着很相似的地方。Prim算法的大概思想是,把點劃分爲兩個集合S和V,先放任意一個點到S中(因爲隨便放哪個得到的結果都是一樣的),然後尋找一條邊,這條邊滿足一端在S中,一端在V中,且權值最小,找到後把它放到邊集裏,把所連接的點也放到S集合中。不斷進行這樣的操作,直到最後V成爲空集。

    C語言代碼。假設是無向圖使用鄰接矩陣存儲。

void prim(int g[N][], int n)
{
	int isSelected[N];
	int cost[N];
	int prevex[N];
	int edge[N][2];
	int lowestCost;
	int vex;

	// 初始化
	for (int i = 0; i < n; ++i)
	{
		isSelected[i] = 0;
		cost[i] = g[0][i];
		prevex[i] = 0;
	}
	isSelected[0] = 1;

	for (int i = 1; i < n; ++i) // 將n-1個點加入樹中
	{
		lowestCost = INFINITE;
		for (j = 1; j < n; ++j)
		{
			if (cost[j] < lowestCost && isSelected[j] == 0)
			{
				vex = j;
				lowestCost = cost[j];
			}
		}
		isSelected[vex] = 1;
		edge[i][0] = prevex[vex];
		edge[i][1] = vex;

		// 刷新cost[]
		for (j = 1; j < n; ++j)
		{
			for (k = 0; k < n; ++k)
			{
				if (isSelected[j] == 0 && isSelected[k] == 1 && cost[j] > g[j][k])
				{
					cost[j] = g[j][k];
					prevex[j] = k;
				}
			}
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章