P3366 【模板】最小生成树
题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出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:array[0..5000,0..5000]of longint;
l:array[0..5000]of longint
;
v:
array
[
0.
.5000
]of boolean;
x,y,z,n,m,i,j,k,ans:longint;
begin
fillchar(a,sizeof(a),$7F)
;//方便后面比较
readln(n,m);
for
i:=
1
to mdo
begin
readln(x,y,z)
;
if
z<a[x,y] then a[x,y]:=z;//走更少的路程
a[y,x]:=a[x,y];//题目输入没有覆盖,需要自己覆盖
end;
fillchar(v,
sizeof
(v),
true
);
fillchar(l,
sizeof
(l),$
7F
);
l[
1
]:=
0
;
for
i:=
1
to n
-1
do
begin
k:=
0
;
for
j:=
1
to ndo
if(l[j]<l[k])and (v[j]) then k:
=j;
v[k]:=
false
;
for
j:=
1
to ndo
if(a[k,j]<l[j])and (v[j]) then l[j]:
=a[k,j];
end;
for
i:=
1
to n
do
ans:=ans+l[i];
writeln(ans);//忘了输出orz,还过了。有点水
end.
//详见上一条博客,只改了输入和数组大小(一下水6题的快感~)http://blog.youkuaiyun.com/ssl_lzx/article/details/68490219