usaco 安慰奶牛
Description
约翰有N个牧场,编号依次为1到N。每个牧场里住着一头奶牛。连接这些牧场的有P条 道路,每条道路都是双向的。第j条道路连接的是牧场Sj和Ej,通行需要Lj的时间。两牧场之 间最多只有一条道路。约翰打算在保持各牧场连通的情况下去掉尽量多的道路。
约翰知道,在道路被强拆后,奶牛会非常伤心,所以他计划拆除道路之后就去忽悠她们。 约翰可以选择从任意一个牧场出发开始他维稳工作。当他走访完所有的奶牛之后,还要回到 他的出发地。每次路过牧场i的时候,他必须花Ci的时间和奶牛交谈,即使之前已经做过工 作了,也要留下来再谈一次。 注意约翰在出发和回去的时候,都要和出发地的奶牛谈一次话。 请你计算一下,约翰要拆除哪些道路,才能让忽悠奶牛的时间变得最少?
Input Format
第一行:两个用空格分开的整数: N和P,5 ≤ N ≤ 10,000,N − 1 ≤ P ≤ 100,000
第二行到N + 1行:第i + 1行包括一个整数Ci,1 ≤ Ci ≤ 1,000
第N + 2行到N + P + 1行:第N + j + 1行包括三个用空格分开的整数Sj,Ej和Lj, 1 ≤ Sj, Ej ≤ N, Sj ≠ Ej,0 ≤ Lj ≤ 1,000
Output Format
第一行:一个整数,表示忽悠所有奶牛需要的最少时间
----------------------------------------------------------------
正解=最小生成树
显然拆完路后,这是一棵树,
题目要求访问所有点,
不难发现,除根节点外,每一个点的访问次数=该点的度
每给当前生成树一条边,则该边连接的两点都会增加一个度
因此一条边的实际权值 = 边长+该边所连两点的点权
然后用Kruskal做最小生成树即可
根结点的反问次数会多一,所以直接找个点权最小的点做根节点即可
代码如下:

#include<cstring>
#include<algorithm>
#include<cstdio>
#include<string>
#include<iostream>
#define INF 999999
using namespace std;
struct Edge{
int x,y,v;
}a[];
int Min=INF,ans,N,P,f[],c[];
int find(int u){
return f[u]==u ? u : f[u]=find(f[u]);
}
bool cmp(const Edge&X,const Edge&Y){
return X.v<Y.v;
}
void kruskal(){
for(int i=;i<=N;i++) f[i]=i;
sort(a+,a++P,cmp);
for(int i=;i<=P;i++) if(find(a[i].x)!=find(a[i].y)){
ans+=a[i].v;
f[find(a[i].x)]=f[find(a[i].y)];
}
}
int main(){
scanf("%d%d",&N,&P);
for(int i=;i<=N;i++){
scanf("%d",&c[i]);
Min=min(c[i],Min);
}
for(int i=;i<=P;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
a[i].v+=a[i].v+c[a[i].x]+c[a[i].y];
}
kruskal();
printf("%d",ans+Min);
}
usaco 安慰奶牛的更多相关文章
- BZOJ1232: [Usaco2008Nov]安慰奶牛cheer
1232: [Usaco2008Nov]安慰奶牛cheer Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 578 Solved: 403[Submi ...
- 1232: [Usaco2008Nov]安慰奶牛cheer
1232: [Usaco2008Nov]安慰奶牛cheer Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 612 Solved: 431[Submi ...
- 157. [USACO Nov07] 奶牛跨栏
157. [USACO Nov07] 奶牛跨栏(点击转到COGS) 输入文件:hurdles.in 输出文件:hurdles.out 时间限制:1 s 内存限制:128 MB 译 by CmY ...
- 算法笔记_067:蓝桥杯练习 算法训练 安慰奶牛(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是 ...
- SPFA cojs 176. [USACO Feb07] 奶牛聚会
cojs 176. [USACO Feb07] 奶牛聚会 ★☆ 输入文件:sparty.in 输出文件:sparty.out 简单对比时间限制:3 s 内存限制:16 MB N(1 ≤ ...
- [bzoj1232][Usaco2008Nov]安慰奶牛cheer_Kruskal
安慰奶牛 cheer bzoj-1232 Usaco-2008 Nov 题目大意:给定一个n个点,m条边的无向图,点有点权,边有边权.FJ从一个点出发,每经过一个点就加上该点点权,每经历一条边就加上该 ...
- cogs 141. [USACO Jan08] 奶牛的选举
141. [USACO Jan08] 奶牛的选举 ★ 输入文件:elect.in 输出文件:elect.out 简单对比时间限制:1 s 内存限制:16 MB 在推翻了Farmer J ...
- 题解 [USACO Mar08] 奶牛跑步
[USACO Mar08] 奶牛跑步 Description Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚. Bessie也不想跑得太远,所 ...
- cogs157. [USACO Nov07] 奶牛跨栏 x
157. [USACO Nov07] 奶牛跨栏 ★★ 输入文件:hurdles.in 输出文件:hurdles.out 简单对比时间限制:1 s 内存限制:128 MB 译 by Cm ...
随机推荐
- ubuntu ll命令
用过 Redhat 的朋友应该很熟悉 ll 这个命令,就相当于 ls -l,但在 Ubuntu 中就不行了.严格来说 ll 不是一个命令,只是命令的别名而已.很多 Linux 用户都使用 bash s ...
- java 面向对象——进度1
面向对象:1,面向对象和面向过程思想. 面向对象强调的是对象实例. 面向过程强调的是动作. 对象将动作进行封装. 在问题领域中,我们先去找的都是涉及的对象, 然后 ...
- css3动画使用技巧之—JQ配合css3实现轮播之animation-delay应用
<!DOCTYPE html> <html> <head> <title>css3动画使用技巧之—JQ配合css3实现轮播之animation-dela ...
- php内存管理
1.为什么需要内存管理 由于计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的, 应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的 ...
- Eyeshot Ultimate 学习笔记(3)
实体角度和位置的控制 有时候导入的模型方向或者角度不太适合,就需要调节一下,这里我发现的一种方法是用到Transformation类,其实有很多类的运用都非常灵活,如果不是有官方示例,恐怕是很难发现的 ...
- web开发工具IDE
1.NetBeans 2.Zend Studio 3.JetBrains WebStorm 4.JetBrains PhpStorm 5.Koala 6.Ionic Lab 7.sublime 8.N ...
- C语言和C++中动态申请内存
在C语言和C++的动态内存的使用方法是不同的,在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h> ...
- WPF DataGrid 自动生成行号的方法(通过修改RowHeaderTemplate的方式)
WPF中的DataGrid自动生成行号的方法有很多,这里记录了一种通过修改 RowHeaderTemplate的方式来生成行号: 方法一: xaml界面: <Window ... xmlns:l ...
- Sqlserver 原生 MD5 函数(转)
--创建md5函数CREATE FUNCTION [dbo].[MD5](@src varchar(255) )RETURNS varchar(255)ASBEGIN DECLARE @md5 ...
- iOS开发者计划(转)
苹果对软件和开发者的管理十分严格,你只有加入了Apple Developer计划之后,才能将你的软件放到真机上运行或者发布到App Store上去.这种方法看似麻烦,但是却有效的解决了盗版和劣质软件充 ...