3366 模板 最小生成樹(Prim)

2022-08-01 06:42:15 字數 1467 閱讀 8524

如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz

輸入格式:

第一行包含兩個整數n、m,表示該圖共有n個結點和m條無向邊。(n<=5000,m<=200000)

接下來m行每行包含三個整數xi、yi、zi,表示有一條長度為zi的無向邊連線結點xi、yi

輸出格式:

輸出包含乙個數,即最小生成樹的各邊的長度之和;如果該圖不連通則輸出orz

**:

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int inf = 1

<<30;7

intn, m;

8struct

edge;

11bool

operator

<(const edge&e1, const edge&e2)

14 priority_queuepq;

15 vector>v;

16int d[5010

];17

bool used[5010

];18

19int

main()

36for(i = 1; i <= n; i++) d[i] =inf;

37 p.k = 1

;38 p.w = 0

;

39int way = 0

; 40

pq.push(p);

41while(!pq.empty()&&donenum<n)54}

55if(donenum56

else cout<57return0;

58 }

備註:

藉著剛默寫完一遍dijkstra的勁頭,把prim過了一遍。prim跟dijkstra神似嘛,所以就想怎麼把dijkstra改成prim。因為gw的ppt上prim的寫法和dijkstra還是有些區別的。。

兩個演算法很小的區別已在**中標出。最開始我特別nc,以為在pop後把p.w的值加起來就行了,實際上,p.w是每個點到源點的距離,而不是到最小生成樹的距離,所以當然不能這麼加。

要改的關鍵就是要記錄下來每個點到最小生成樹的距離,而不是到源點的距離。所以實際上只要改標黃那三行就可以了!ps:我是寫著寫著才突然發現實際上就是把dijkstra的q.w = p.w + v[p.k][i].w改成q.w = v[p.k][i].w就行了。

看來對dijkstra的深刻理解還是很有價值的。hhh

luogu3366 模板 最小生成樹 Prim

給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz。對於乙個無向圖,要求選出一些邊,使得圖上的每乙個節點互相連通,且邊權和最小。選出的邊與節點形成的子圖必然是顆樹,這棵樹叫做最小生成樹。最小生成樹中,除根節點外,每乙個節點作為乙個to節點與它相鄰的邊的邊權 以後簡稱最小相鄰邊權 必然是最小...

洛谷 3366 最小生成樹 Prim

如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出包含乙個數,即最小生成樹的各邊的長度之和 如...

最小生成樹prim模板

1.模板一 此段模板取自 挑戰程式設計競賽 p106 107 int cost inf inf 邊 int used inf int mincost inf x到節點v的最小值 int v int prim mincost 0 0 int res 0 while 1 if v 1 break use...