描述
普里姆算法(Prim算法),圖論中的一種算法,可在加權連通圖裏搜索最小生成樹。意即由此算法搜索到的邊子集所構成的樹中,不但包括了連通圖裏的所有頂點(英語:Vertex (graph theory)),且其所有邊的權值之和亦爲最小。
時間複雜度:O(n^2)
int prim(int n)
{
int total_weight = 0;
memset(dist, INF, sizeof(dist));
memset(vis, false, sizeof(vis));
dist[0] = 0;
//從編號爲0的節點開始遍歷,0節點到0節點的距離爲零
//將0節點加入最小生成樹
for(int i = 0; i < n; i ++)
{
int min_dist = INF, min_vertex;
for(int j = 0; j < n; j ++)
{
if(!vis[j] && min_dist > dist[j])
{
min_vertex = j;
min_dist = dist[j];
}
}
//將選出來的邊加入最小生成樹
vis[min_vertex] = true;
total_weight += min_dist;
for(int j = 0; j < n; j ++)
{
//找出距離當前節點距離最小的頂點,且未訪問
if(!vis[j] && data[min_vertex][j] < dist[j])
{
dist[j] = data[min_vertex][j];
}
}
}
return total_weight;
}