1. 程式人生 > >最小生成樹(Minimum Spanning Tree)(Prim演算法)

最小生成樹(Minimum Spanning Tree)(Prim演算法)

1. 什麼是最小生成樹(Minimum Spanning Tree)


2. 貪心演算法:

1) 什麼是“貪”:每一步都要最好的

2) 什麼是“好”:權重最小的邊

3) 需要約束:

     a) 只能用圖裡有的邊

     b) 只能正好用掉|v| - 1條邊

     c)  不能有迴路

3. Prim演算法(讓一棵小樹長大):


Dijkstra和Prim演算法和類似,如下:

Dijkstra演算法:

Void Dijkstra(Vertex s)
{
	while(1)
	{
		V = 未收錄頂點中dist最小者;
		if( 這樣的V不存在 )
			break;
		collected[V] = true;
		for(V的每個鄰接點 W )
		{
			if(collected[W] == false)
			{
				if(dist[V] +E<v, w> < dist[W])
				{
					dist[W] = dist[V] + E<v,w>;
					path[W] = V;
				}
			}
		}
	}
}
Prim演算法和Dijkstra演算法類似地方:
void Prim()
{
	MST = {s};
	while(1)
	{
		V = 未收錄頂點中dist最小者;
		if( 這樣的V不存在 )
			break;
		將V收錄進MST:
		for( V的每個鄰接點W )
		{
			if( W未被收錄 )
			{
				dist[W] = E(v, w);
				parent[W] = V;
			}
		}
	}
}

Prime完整偽碼:
void Prim()
{
	MST ={S};
	while(1)
	{
		V = 未收錄頂點中dist最小者;
		if(這樣的V不存在)
			break;
		將V收錄進MST:dist[V] = 0
		for( V的每個鄰接點W )
		{
			if( dist[W] != 0 )
			{
				if(E(v,w) < dist[W])
				{
					dist[W] = E(v,w);
					parent[W] = V;
				}
			}
		}
	}
	if(MST中收到的頂點不到|V|個)
		Error(“生成樹不存在”);
}
5. Prim注意點:

1) dist[V] = E(s, v)或正無窮

2) parent[s] = -1

T = O(|V|2) - 稠密圖合算