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

1. 什么是最小生成树(Minimum Spanning Tree)

最小生成树(Minimum Spanning Tree)(Prim算法)_第1张图片

2. 贪心算法:

1) 什么是“贪”:每一步都要最好的

2) 什么是“好”:权重最小的边

3) 需要约束:

     a) 只能用图里有的边

     b) 只能正好用掉|v| - 1条边

     c)  不能有回路

3. Prim算法(让一棵小树长大):

最小生成树(Minimum Spanning Tree)(Prim算法)_第2张图片

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) - 稠密图合算



你可能感兴趣的:(最小生成树(Minimum Spanning Tree)(Prim算法))