传送门

一次a就很开心

可以当作kruskal模板题(orz

--------------------------------------------------------------------------------------

约翰有N个牧场,编号依次为1到N。每个牧场里住着一头奶牛。连接这些牧场的有P条道路,每条道路都是双向的。第j条道路连接的是牧场Sj和Ej,通行需要Lj的时间。两牧场之间最多只有一条道路。约翰打算在保持各牧场连通的情况下去掉尽量多的道路。

约翰知道,在道路被强拆后,奶牛会非常伤心,所以他计划拆除道路之后就去忽悠她们。约翰可以选择从任意一个牧场出发开始他维稳工作。当他走访完所有的奶牛之后,还要回到他的出发地。每次路过牧场i的时候,他必须花Ci的时间和奶牛交谈,即使之前已经做过工作了,也要留下来再谈一次。注意约翰在出发和回去的时候,都要和出发地的奶牛谈一次话。请你计算一下,约翰要拆除哪些道路,才能让忽悠奶牛的时间变得最少?

--------------------------------------------------------------------------------------

新的边权为原边权*2+边的两端点的点权值

Kruskal一边

再加上最小的点权(把它当作起点

O(mlogm)

--------------------------------------------------------------------------------------

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std; inline int read()
{
int sum = ,p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= ) += ch - '';
ch = getchar();
}
return sum * p;
} int n,p,ans;
int val[];
int head[],cnt;
struct edge
{
int to,wei,frm;
}e[];
int fa[]; bool cmp(edge a,edge b)
{
return a.wei < b.wei;
} int findfa(int o)
{
if(fa[o] == o)
return o;
else
return fa[o] = findfa(fa[o]);
} void kruskal()
{
int k = ;
for(int i = ;i <= n;i++)
fa[i] = i;
sort(e+,e+p+,cmp);
for(int i = ;i <= p;i++)
{
int a = findfa(e[i].frm);
int b = findfa(e[i].to);
if(a == b)
continue;
ans += e[i].wei;
fa[a] = b;
if(++k == n - )
break;
}
} int main()
{
n = read(),p = read();
for(int i = ;i <= n;i++)
val[i] = read();
for(int i = ;i <= p;i++)
{
int a= read(),b = read(),c = read();
e[++cnt].frm = a;
e[cnt].to = b;
e[cnt].wei = val[a] + val[b] + c * ;
}
kruskal();
sort(val+,val++n);
printf("%d",ans + val[]);
return ;
}

最新文章

  1. KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)
  2. HTML5+CSS3 - 代码简写篇
  3. 启动 apache2.4 出现 invalid command order 问题 【由于 PHP 访问权限 403 问题引起】
  4. 在vCenter5.5中为用户创建角色,管理虚拟机
  5. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要一
  6. JavaScript实现HTML5烟花特效
  7. phpcms更换域名用户无法注册问题
  8. 23.跳台阶问题[Fib]
  9. Version of SQLite used in Android?
  10. ShadowGun Deadzone 放出 GM Kit Mod 包
  11. pager-taglib 使用说明2
  12. Buffett saying
  13. NYOJ-63 小猴子下落(二叉树及优化算法详解)
  14. ASP.NET Core 认证与授权[1]:初识认证
  15. Git分支-分支简介
  16. Xcode7.3.1中SKAudioNode在Scene转换后无声的问题
  17. Typescript学习笔记(三)变量声明及作用域
  18. Jquery监听AJAX请求
  19. 12: nginx原理及常用配置
  20. Install and Configure Apache Kafka

热门文章

  1. 3ds Max File Format (Part 2: The first inner structures; DllDirectory, ClassDirectory3)
  2. liunx 中设置zookeeper 自启动(service zookeeper does not support chkconfig)
  3. centos7中 yum的安装
  4. linux 扩展内存
  5. 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)
  6. Oracle允许IP访问配置
  7. SpringMVC请求乱码问题
  8. nginx的错误处理
  9. OpenCV图像载入、显示和输出到文件以及滑块的使用
  10. pip知识点