如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz
輸入格式:
第一行包含兩個整數n、m,表示該圖共有n個結點和m條無向邊。(n<=5000,m<=200000)
接下來m行每行包含三個整數xi、yi、zi,表示有一條長度為zi的無向邊連線結點xi、yi
輸出格式:
輸出包含乙個數,即最小生成樹的各邊的長度之和;如果該圖不連通則輸出orz
**:
1 #include2 #include3 #include4 #include5using
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...