模板 最小生成樹

2021-07-26 19:28:17 字數 2038 閱讀 5696

題目描述

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

輸入輸出格式

輸入格式:

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

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1:

4 5

1 2 2

1 3 2

1 4 3

2 3 4

3 4 3

輸出樣例#1:

7說明

時空限制:1000ms,128m

資料規模:

對於20%的資料:n<=5,m<=20

對於40%的資料:n<=50,m<=2500

對於70%的資料:n<=500,m<=10000

對於100%的資料:n<=5000,m<=200000

樣例解釋:

所以最小生成樹的總邊權為2+2+3=7

var a,b,c,d:array[0..200000]of longint;

i,j,n,ans,tot,x,m,k:longint;

function

ask(x:longint):longint;

begin

if d[x]=x then

exit(d[x]);

d[x]:=ask(d[x]);

exit(d[x]);

end;

procedure

unite

(x,y:longint);

begin

d[ask(x)]:=ask(y);

end;

procedure

swap

(var a,b:longint);

var t:longint;

begin

t:=a; a:=b; b:=t;

end;

procedure

sort

(l,r:longint);

var i,j,x: longint;

begin

i:=l; j:=r;

x:=a[(l+r) div

2]; repeat

while a[i]do inc(i);

while xdo dec(j);

ifnot(i>j) then

begin

swap(a[i],a[j]);

swap(b[i],b[j]);

swap(c[i],c[j]);

inc(i);

j:=j-1;

end;

until i>j;

if lthen sort(l,j);

if ithen sort(i,r);

end;

begin

read(n,m);

for i:=1

to m do

read(b[i],c[i],a[i]);

sort(1,m);

for i:=1

to n do d[i]:=i;

while tot1

dobegin

inc(k);

if ask(b[k])<>ask(c[k])then

begin

inc(ans,a[k]);

unite(b[k],c[k]);

inc(tot);

end;

end;

write(ans);

end.

最小生成樹模板

prim演算法理解可以參考部落格 prim演算法模板 int prime int v int i,j,sum 0,min,k sum是權重和 for i 1 i n i lowcost i 表明當前狀態下在u內距離v點 s中各點 距離的最小值,每個u中點s 中點 都計算 lowcost i map ...

最小生成樹 模板

const int maxn 1010 const int maxm 200020 struct edge edges maxm int father maxn int find int x int cmp edge a,edge b 將邊按權值排序 int kruskal int n,int m ...

模板 最小生成樹

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