题目描述 Description
学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的。为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接。
为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用。
输入描述 Input Description
输入第一行为两个整数n,m(2<=n<=100000,2<=m<=100000),表示计算机总数,和可以互相建立连接的连接个数。接下来m行,每行三个整数a,b,c 表示在机器a和机器b之间建立连接的话费是c。(题目保证一定存在可行的连通方案, 数据中可能存在权值不一样的重边,但是保证没有自环)
输出描述 Output Description
输出只有一行一个整数,表示最省的总连接费用。
样例输入 Sample Input
3 3
1 2 1
1 3 2
2 3 1
样例输出 Sample Output
2
题解:最小生成树,考虑到有重边用kruskal比较好
const
maxn=100000;
var
edge:array[0..maxn,1..3]of longint;
fa,r:array[0..maxn]of longint;
n,i,j,m:longint;
ans:int64;
function find(x:longint):longint;
begin
if fa[x]=x then exit(x);
fa[x]:=find(fa[x]);
find:=fa[x];
end;
procedure union(x,y:longint);
var
u,v:longint;
begin
u:=find(x);v:=find(y);
if u<>v then
begin
if r[u]<=r[v] then
begin
fa[u]:=v;
if r[u]=r[v] then inc(r[v]);
end
else fa[v]:=u;
end;
end;
procedure qsort(l,r:longint);
var
i,j,key:longint;
begin
if l>r then exit;
i:=l;j:=r;
key:=edge[(l+r)shr 1,3];
repeat
while edge[i,3]<key do inc(i);
while edge[j,3]>key do dec(j);
if i<=j then
begin
edge[0]:=edge[i];edge[i]:=edge[j];edge[j]:=edge[0];
inc(i);dec(j);
end;
until i>j;
qsort(l,j);
qsort(i,r);
end;
procedure kruskal;
var
i:longint;
begin
for i:=1 to m do
if find(edge[i,1])<>find(edge[i,2]) then
begin
union(edge[i,1],edge[i,2]);
inc(ans,edge[i,3]);
end;
end;
procedure init;
var
i,j:longint;
begin
readln(n,m);
for i:=1 to n do
fa[i]:=i;
for i:=1 to m do
readln(edge[i,1],edge[i,2],edge[i,3]);
end;
begin
init;
qsort(1,m);
kruskal;
writeln(ans);
end.