[CodeVS]1231 最优布线问题

主要算法:贪心;数据结构:并查集;

题目描述:

学校需要将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

[CodeVS]1231 最优布线问题的相关文章

最小生成树 之 CODE[VS] 1231 最优布线问题

/* 最小生成树 之 CODE[VS] 1231 最优布线问题 Kruskal算法(邻接表) */ 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstddef> 5 #include <iterator> 6 #include <algorithm> 7 #include <string> 8 #include <

1231 最优布线问题

1231 最优布线问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接. 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用. 输入描述 In

最小生成树——最优布线问题

最优布线问题(wire.cpp) [问题描述] 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们间有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的. 当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的.为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接. 现在由你负责连接这些计算机,任务是使任意两台计算机都连通(不管是直接的或间接的). [输入格

19.最优布线问题(kruskal算法)

最优布线问题(kruskal算法) 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接. 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算

最小生成树Kruskal——最优布线问题(codevs 1231) (可做Kruscal模板)

题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接. 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用. 输入描述 Input Description 输入第一行为两个整数n,m(2<=n<=100000,2<=m<

[CODEVS 1173] 最优贸易

描述 http://www.codevs.cn/problem/1173/ 分析 官方解法 先考虑如果题目中的线路不会构成环, 那么问题可以简化成一个DP就可以解决的问题=> 先正着DP, 找出在每个点之前可以买进的最低的价格 minp ; 再倒着DP, 统计出在每个点之后可以卖出的最高价格 maxp , 取所有点中的minp - maxp 的最大值就是最大的收益. 现在的问题就是解决环的存在, 因为有环的话没有一个拓扑序供我们DP使用. 所以用Tarjan算法求强联通分量缩点, 同时统计出缩点

codevs 1173 最优贸易(DP+SPFA运用)

/* 中国的题目 ——贱买贵卖 0.0 这题wa了好多遍 第一遍看着题 哎呀这不很简单嘛 从起点能到的点都是合法的点 然后统计合法的点里最大最小值 然后printf 也不知道哪里来的自信 就这么交了 然后爆零了 第二遍想了想 恩 刚开始思路有问题 必须先买后卖 买的点要在卖的前面 恩 很有道理 然后数组模拟着统计了一下i之前的最小值和i之后的最大值 并且确保每个点都是合法的 然后 连样例都不对了..... 第三遍 终于找到了问题的关键(好吧我是看到标签里有spfa才想到了) 因为他是图啊 图啊

初学并查集-2:最优布线问题

题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接. 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用. 输入描述 Input Description 输入第一行为两个整数n,m(2<=n<=100000,2<=m<

最小生成树prim算法

codevs.cn 最优布线问题 #include<cstdio>#include<cstring> bool u[101]; int g[101][101],minn[101]; int main(){ int n,m,q,p,total=0; scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) {  scanf("%d%d",&q,&p);  scanf("