最小生成樹 prim

2021-07-08 15:17:24 字數 1442 閱讀 9671

思想:

mst(minimum spanning tree,最小生成樹)問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是:設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u-v中找到另一點b使得點b到v中任意一點的權值最小,此時將b點也加入集合v;以此類推,現在的集合v=,再從集合u-v中找到另一點c使得點c到v中任意一點的權值最小,此時將c點加入集合v,直至所有頂點全部被加入v,此時就構建出了一顆mst。因為有n個頂點,所以該mst就有n-1條邊,每一次向集合v中加入乙個點,就意味著找到一條mst的邊。

過程:

測試用例:

輸入:

6 10

1 2 6

1 3 1

1 4 5

2 3 5

2 5 3

3 4 5

3 5 6

3 6 4

4 6 2

5 6 6

輸出:

# define inf 0x3f3f3f3f//這個可以與memset(陣列名,inf,sizeof(陣列名)); 這樣可以對陣列的全部元素賦值為最大值

intmap[maxn][maxn],lowcost[maxn];

bool visit[maxn];

int n,m,sum;//n節點 m邊數 sum儲存的是乙個城市到另乙個城市的最小權值

/* map儲存的是map[a][b] --->a到b的權值

lowcost陣列儲存的是乙個城市到其餘的城市的最小的權值

visit儲存的是該節點是否被訪問過

*/void prim();

int main()

prim();

printf("%d\n",sum);

}return0;}

void prim()

for(int i=1;i<=n;i++)

}if(temp == inf)//該節點與任何節點沒有相連,

break;

visit[k] = true;//把這個城市加入最小生成樹集合

sum+=temp; //記錄權值之和

for(int j=1;j<=n;j++)

} } }

最小生成樹 Prim

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

最小生成樹 prim

演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...

最小生成樹 PRIM

這個是有關普利姆的演算法,從乙個點出發,找出與這個點相連的所有點的對應的權值最小的那個,然後再把這個點從集合中劃掉。模板如下 include include define inf 0xfffff define max 2005 using namespace std int map max max ...