码迷,mamicode.com
首页 > 其他好文 > 详细

[CodeVS]1231 最优布线问题

时间:2016-08-22 08:13:23      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

主要算法:贪心;数据结构:并查集;
题目描述:
学校需要将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.
View Code

爆零狗将与你同在,阿门!

[CodeVS]1231 最优布线问题

标签:

原文地址:http://www.cnblogs.com/Jrzn/p/5794239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!