1232: [Usaco2008Nov]安慰奶牛cheer

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 612  Solved: 431
[Submit][Status]

Description

Farmer John变得非常懒, 他不想再继续维护供奶牛之间供通行的道路. 道路被用来连接N (5 <= N <= 10,000)个牧场, 牧场被连续地编号为1..N. 每一个牧场都是一个奶牛的家. FJ计划除去P(N-1 <= P <= 100,000)条道路中尽可能多的道路, 但是还要保持牧场之间的连通性. 你首先要决定那些道路是需要保留的N-1条道路. 第j条双向道路连接了牧场S_j和E_j (1 <= S_j <= N; 1 <= E_j <= N; S_j != E_j), 而且走完它需要L_j (0 <= L_j <= 1,000)的时间. 没有两个牧场是被一条以上的道路所连接. 奶牛们非常伤心, 因为她们的交通系统被削减了. 你需要到每一个奶牛的住处去安慰她们. 每次你到达第i个牧场的时候(即使你已经到过), 你必须花去C_i (1 <= C_i <= 1,000)的时间和奶牛交谈. 你每个晚上都会在同一个牧场(这是供你选择的)过夜, 直到奶牛们都从悲伤中缓过神来. 在早上起来和晚上回去睡觉的时候, 你都需要和在你睡觉的牧场的奶牛交谈一次. 这样你才能完成你的交谈任务. 假设Farmer John采纳了你的建议, 请计算出使所有奶牛都被安慰的最少时间. 对于你前10次的提交, 你的程序会在一部分正式的测试数据上运行, 并且返回运行的结果.

Input

* 第 1 行: 用空格隔开的两个整数N和P * 第 2..N+1 行: 第i+1行包含了一个整数: C_i * 第 N+2..N+P+1 行: 第 N+j+1 行包含用空格隔开的三个整数: S_j, E_j 和 L_j

Output

第 1 行: 一个整数, 所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间).

Sample Input

5 7
10
10
20
6
30
1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6
4 5 12

Sample Output

176

HINT

Source

题解:这是一个比较喜闻乐见的最小生成树,不像是一般的直接上,各个边的权值是左边点的权值+右边点的权值+边原来的长度×2,然后建树,然后求出树的总长,然后再加上权值最小的点的权值,别的没了。。。有点难想到。。。

 1 /**************************************************************
 2     Problem: 1232
 3     User: HansBug
 4     Language: Pascal
 5     Result: Accepted
 6     Time:436 ms
 7     Memory:2724 kb
 8 ****************************************************************/
 9
10 var
11    i,j,k,l,m,n,ans:longint;
12    a,c:array[0..20000] of longint;
13    b:array[0..200000,1..3] of longint;
14 function getfat(x:longint):longint;inline;
15          begin
16               if x<>c[x] then c[x]:=getfat(c[x]);
17               exit(c[x]);
18          end;
19 procedure swap(var x,y:longint);inline;
20           var z:longint;
21           begin
22                z:=x;x:=y;y:=z;
23           end;
24 procedure sort(l,r:longint);inline;
25           var i,j,x,y:longint;
26           begin
27                i:=l;j:=r;x:=b[(l+r) div 2,3];
28                repeat
29                      while b[i,3]<x do inc(i);
30                      while b[j,3]>x do dec(j);
31                      if i<=j then
32                         begin
33                              swap(b[i,1],b[j,1]);
34                              swap(b[i,2],b[j,2]);
35                              swap(b[i,3],b[j,3]);
36                              inc(i);dec(j);
37                         end;
38                until i>j;
39                if i<r then sort(i,r);
40                if l<j then sort(l,j);
41           end;
42 begin
43      readln(n,m);
44      for i:=1 to n do readln(a[i]);
45      for i:=1 to n do c[i]:=i;
46      for i:=1 to m do
47          begin
48               readln(b[i,1],b[i,2],b[i,3]);
49               b[i,3]:=b[i,3]*2+a[b[i,1]]+a[b[i,2]];
50          end;
51      sort(1,m);
52      j:=0;
53      for i:=1 to n-1 do
54          begin
55               inc(j);
56               while true do
57                     begin
58                          k:=getfat(b[j,1]);
59                          l:=getfat(b[j,2]);
60                          if k<>l then break;
61                          inc(j);
62                     end;
63               ans:=ans+b[j,3];
64               c[k]:=l;
65          end;
66      j:=maxlongint;
67      for i:=1 to n do if a[i]<j then j:=a[i];
68      writeln(ans+j);
69      readln;
70 end.

转载于:https://www.cnblogs.com/HansBug/p/4262761.html

1232: [Usaco2008Nov]安慰奶牛cheer相关推荐

  1. bzoj 1232: [Usaco2008Nov]安慰奶牛cheer【最小生成树】

    有趣 每条边在算答案的时候被算了二倍的边权值加上两个端点的权值,然后睡觉点额外加一次 所以可以用这个权做MST,然后加上点权最小的点 #include<iostream> #include ...

  2. bzoj 1232 [Usaco2008Nov]安慰奶牛cheer

    思路:看出跟dfs的顺序有关就很好写了, 对于一棵树来说确定了起点那么访问点的顺序就是dfs序,每个点经过 其度数遍,每条边经过2边, 那么我们将边的权值×2加上两端点的权值跑最小生成树,最后加上一个 ...

  3. bzoj1232[Usaco2008Nov]安慰奶牛cheer*

    bzoj1232[Usaco2008Nov]安慰奶牛cheer 题意: 给出n个节点的带权图,第i个节点ci.现在你要在这个图中选出一棵树和一个起点,然后你要从起点出发到达所有的节点(不能跳点)再回到 ...

  4. BZOJ 1232 USACO 2008 Nov. 安慰奶牛Cheer

    [题解] 对于每一条边,我们通过它需要花费的代价是边权的两倍加上这条边两个端点的点权. 我们把每条边的边权设为上述的值,然后跑一边最小生成树,再把答案加上最小的点权就好了. 1 #include< ...

  5. BZOJ1232 安慰奶牛cheer (洛谷2916)

    标签:并查集,最小生成树 tips:bzoj这题为权限题,可以去洛谷2916提交 Description Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N ( ...

  6. 蓝桥杯-安慰奶牛(java)

    算法训练 安慰奶牛   时间限制:1.0s   内存限制:256.0MB 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为 ...

  7. P2916 [USACO08NOV]安慰奶牛Cheering up the Cow

    题目 P2916 [USACO08NOV]安慰奶牛Cheering up the Cow 分析 这题开始不是很懂它的意思,看了题解才懂的.举个例子:有一条边 a->b 那么假定我们从a点出发再回 ...

  8. 安慰奶牛 问题描述 Farmer John变得非常懒,他不想再继续维

    package ALGO;/*安慰奶牛 时间限制:1.0s 内存限制:256.0MB问题描述Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续 ...

  9. C语言题目奶牛牧场,C语言算法训练:安慰奶牛

    C语言算法训练:安慰奶牛 导语:FJ变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.下面我们来看看C语言算法训练:安慰奶牛. 每一个牧场都是一个奶 ...

最新文章

  1. R语言条件Logistic回归模型案例:研究饮酒与胃癌的关系
  2. java 线程池(2)
  3. 深入浅出Android系统启动流程
  4. Java安全管理器――SecurityManager
  5. java 转换成时间戳_Java 实例 – 时间戳转换成时间 - Java 基础教程
  6. 一个asp.net2005的页面文件调用CSS样式的BUG
  7. 《Python Cookbook 3rd》笔记(5.1):读写文本数据
  8. 【ffmpeg for wince】音视频编解码多平台移植(for window/wince)
  9. 为什么说DeFi将催生银行业杀手级应用?
  10. 石头高墙怎么放_朱良志:古人对石头的审美
  11. js:图片的切换(代码)
  12. 零拷贝原理详解(很多大厂面试题哦)
  13. VUE之多元素组件过渡+动画封装
  14. android 连接tftp 服务器
  15. C++——打印乘法口诀表
  16. summery 总结篇 访问对象属性的方法
  17. pdf文件删除空白页技巧介绍
  18. 计算机语言有许多种其中与硬件直接相关的是,【单选题】计算机语言有许多种,其中与硬件直接相关的是 A. 机器语言 B. 网络语言 C. 高级语言 D. 自然语言...
  19. 校验码——海明码及码距,码距
  20. matlab获取基金数据,读取WIND数据(行情、基金净值等)的SAS程序

热门文章

  1. Mysql8.0和Mysql5.0访问jdbc连接
  2. 词袋 图像检索 matlab,词袋模型BoW图像检索Python实战
  3. 苹果 macOS Big Sur 11.5 RC 2(20G71)候选版本发布
  4. Python turtle正方形绘制
  5. 干货:Hulu教你赴美工作怎么拿签证!
  6. asp.net1025-物流信息管理系统#毕业设计
  7. 爬虫(数据采集与预处理课程)
  8. 桌面计算机图标带虚线框,win10系统桌面图标的虚线框去掉的具体办法
  9. SQLServer存储过程大全
  10. 看了这4点,shopee店铺出单从此变简单