Kruskal算法:
void Kruskal ( )
{
MST = { } ; //邊的集合,最初爲空集
while( EdgeAccepted < NumVertex - 1
&& E中還有邊 ) //MST中邊數不到V-1
{
E(V, W) = Min( E ); //最小堆
Delete( E(V, W) ); //將其從E中刪除
Uset = Find( U, S ); //並查集
Vset = Find( V, S ); //並查集
if( Uset != Vset ) //E(V, W)不在MST中構成迴路
{
EdgeAccepted++; //更新MST中邊數
SetUnion( S, Uset, Vset ); //併入集合 //並查集
}
else
徹底無視E(V, W);
}
if (EdgeAccepted < NumVertex - 1)
ERROR(生成樹不存在)
}
Prim算法時間複雜度O(V²),適用於稠密圖
void Prim ( )
{
/*MST = { s, }*/ //樹集中只有源點S
while ( 1 )
{
V = smallest unknow distance vertex; //未收錄頂點中dist最小者
if( no V ) //V不存在
break;
dist[V] = 0; //收錄
for( each W adjacent to V ) //V的每個鄰接點W
{
if( dist[W] != 0 ) //如果未收錄
{
if( E(V, W) < dist[W] )
{ //路徑變短,更新一下
dist[W] = E(V, W);
parent[W] = V; //並查集併入樹集合中
}
}
}
}
if( 收錄頂點不到 != 總頂點 )
ERROR("生成樹不存在");
}
初始化:dist[V] = E(s, V) OR INF;
parent[s] = -1;