标签:
学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的。为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接。
为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用。
输入第一行为两个整数n,m(2<=n<=100000,2<=m<=100000),表示计算机总数,和可以互相建立连接的连接个数。接下来m行,每行三个整数a,b,c 表示在机器a和机器b之间建立连接的话费是c。(题目保证一定存在可行的连通方案, 数据中可能存在权值不一样的重边,但是保证没有自环)
输出只有一行一个整数,表示最省的总连接费用。
3 3
1 2 1
1 3 2
2 3 1
2
最终答案需要用long long类型来保存
代码:Kruscal就是排序+并查集思路
var aa,bb,t,n,m,i,j:longint; sum:int64;
f,a,b,c:array[1..100000] of longint;
function find(x:longint):longint;
begin
if f[x]=x then exit(x)
else find:=find(f[x]);
f[x]:=find;
end;
procedure qsort(l,r: longint); //快排
var
i,j,x,y: longint;
begin
i:=l; j:=r; x:=c[(l+r) div 2];
repeat
while c[i]<x do inc(i);
while x<c[j] do dec(j);
if not(i>j) then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
y:=b[i]; b[i]:=b[j]; b[j]:=y;
y:=c[i]; c[i]:=c[j]; c[j]:=y;
inc(i); j:=j-1;
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
procedure kruscal; //Kruscal就是并查集思想
var i,j:longint;
begin
for i:=1 to n do f[i]:=i;
for i:=1 to m do
begin
a[i]:=find(a[i]);
b[i]:=find(b[i]);
if a[i]<>b[i] then
begin
f[a[i]]:=b[i];
sum:=sum+c[i];
inc(t);
if t=n-1 then break;
end;
end;
end;
begin readln(n,m); for i:=1 to m do readln(a[i],b[i],c[i]); qsort(1,m); kruscal; writeln(sum); end.
最小生成树Kruskal——最优布线问题(codevs 1231) (可做Kruscal模板)
标签:
原文地址:http://www.cnblogs.com/zqzxwdm/p/4743855.html