主要算法:贪心;数据结构:并查集;
题目描述:
学校需要将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
有的神犇说:“这道题不是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.
爆零狗将与你同在,阿门!
时间: 2024-11-03 21:43:19