标签:
输入第一行为两个整数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
有的神犇说:“这道题不是Kruskal”(最小生成树)吗?,可是作为蒟蒻,kruskal不会啊!没办法,试试并查集,没想到竟然能A,看起来貌似也挺水的
题意太裸,我萌可以看看代码。
Sb(傻逼)代码如下(并查集+贪心):
var pre,a,b,c:array[1..10000000]of int64; n,m,fa,fb,ans,t:int64; i:longint; function find(x:int64):int64; begin if pre[x]=x then exit(x); find:=find(pre[x]); pre[x]:=find; end; procedure kp(l,r:int64); var i,j,mid,t:int64; begin i:=l; j:=r; mid:=c[(l+r)div 2]; repeat while (c[i]<mid) do inc(i); while (c[j]>mid) do dec(j); if i<=j then begin t:=a[i];a[i]:=a[j];a[j]:=t; t:=b[i];b[i]:=b[j];b[j]:=t; t:=c[i];c[i]:=c[j];c[j]:=t; inc(i);dec(j); end; until i>j; if i<r then kp(i,r); if l<j then kp(l,j); end; begin read(n,m); for i:=1 to n do pre[i]:=i; for i:=1 to m do read(a[i],b[i],c[i]); kp(1,m); t:=1; for i:=1 to m do begin fa:=find(a[i]);fb:=find(b[i]); if fa<>fb then begin inc(ans,c[i]); pre[fa]:=pre[fb]; t:=t+1; if t=n then begin writeln(ans); halt; end; end; end; end.
爆零狗将与你同在,阿门!
标签:
原文地址:http://www.cnblogs.com/Jrzn/p/5794239.html