最小生成树:
1 . 包含全部v个顶点、v+1条边
2 . 无回路、连通图
3 . 边权值和最小
// Prim算法(和Dijkstra有点像) T=O(V^2)
void Prim()
{
MST= {s}
while(1)
{
v=未收录顶点中dist最小者
if(这样的点不存在)
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;
}
// Kruskal算法 T=O(ElogE)
void Kruskal(Graph G)
{
MST={};
while(MST中不到V-1条边 && E中还有边)
{
从E中取一条权重最小边E(V,W); //最小堆
将E(V,W)从E中删除;
if(E(V,W)不在MST中构成回路) //并查集
将E(V,W)加入MST;
else
彻底无视E(V,W);
}
if(MST中不到V-1条边)
ERROR;
}