[Usaco2007 Jan]Telephone Lines架设电话线
题目描述
FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务。于是,FJ必须为此向电信公司支付一定的费用。FJ的农场周围分布着N(1<=N<=1,000)根按1..N顺次编号的废弃的电话线杆,任意两根电话线杆间都没有电话线相连。一共P(1<=P<=10,000)对电话线杆间可以拉电话线,其余的那些由于隔得太远而无法被连接。第i对电话线杆的两个端点分别为A_i、B_i,它们间的距离为L_i(1<=L_i<=1,000,000)。数据中保证每对{A_i,B_i}最多只出现1次。编号为1的电话线杆已经接入了全国的电话网络,整个农场的电话线全都连到了编号为N的电话线杆上。也就是说,FJ的任务仅仅是找一条将1号和N号电话线杆连起来的路径,其余的电话线杆并不一定要连入电话网络。经过谈判,电信公司最终同意免费为FJ连结K(0<=K<N)对由FJ指定的电话线杆。对于此外的那些电话线,FJ需要为它们付的费用,等于其中最长的电话线的长度(每根电话线仅连结一对电话线杆)。如果需要连结的电话线杆不超过K对,那么FJ的总支出为0。请你计算一下,FJ最少需要在电话线上花多少钱。
输入格式
第1行: 3个用空格隔开的整数:N,P,以及K
第2..P+1行: 第i+1行为3个用空格隔开的整数:A_i,B_i,L_i
输出格式
第1行: 输出1个整数,为FJ在这项工程上的最小支出。
如果任务不可能完成, 输出-1
容易想到的策略是:把1~n路径上花费最高的k条路径去掉。所以我们可以枚举每条路径并枚举路径上的每条边来解答。但这显然不是我们能够接受的复杂度。
我们需要换一种思路来做。我们来分析一下答案的性质:
设答案为ans,那么在1~n的所有路径中lenth<=ans的都可以免费,其余的计入k条免费线路中。如果ans过小,那么lenth>ans的路径数可能大于k,如果过大则得不到最优解。所以我们可以二分答案,对于每个二分出的limitation,把边长大于它的路线的代价改成1,其余的代价为0。然后跑一遍最短路,看最短路长度是否≤k即可。
最短路可以用Dijkstra+Heap做到O((N+M) * logN),二分答案的复杂度为O(logAns),所以总复杂度为:
\]
可以通过本题。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define maxn 1001
#define maxm 10001
using namespace std;
struct edge{
int to,next,dis;
edge(){}
edge(const int &_to,const int &_dis,const int _next){
to=_to,dis=_dis,next=_next;
}
}e[maxm<<1];
int head[maxn],k;
int dis[maxn],maxlen,ans;
bool vis[maxn];
int n,m,t;
priority_queue< pair<int,int>,vector< pair<int,int> >,greater< pair<int,int> > > q;
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
inline void add(const int &u,const int &v,const int &w){
e[k]=edge(v,w,head[u]);
head[u]=k++;
}
inline void dijkstra(const int &lim){
memset(dis,0x3f,sizeof dis);
memset(vis,false,sizeof vis);
q.push(make_pair(0,1));
dis[1]=0;
while(q.size()){
int u=q.top().second; q.pop();
if(vis[u]) continue; vis[u]=true;
for(register int i=head[u];~i;i=e[i].next){
int v=e[i].to;
if(dis[v]>dis[u]+(e[i].dis>lim))
dis[v]=dis[u]+(e[i].dis>lim),q.push(make_pair(dis[v],v));
}
}
}
int main(){
memset(head,-1,sizeof head);
n=read(),m=read(),t=read();
for(register int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
add(u,v,w),add(v,u,w);
if(maxlen<w) maxlen=w;
}
int l=0,r=maxlen,flag=false;
while(l<=r){
int lim=l+r>>1;
dijkstra(lim);
if(dis[n]<=t) flag=true,ans=lim,r=lim-1;
else l=lim+1;
}
printf("%d\n",flag?ans:-1);
return 0;
}
[Usaco2007 Jan]Telephone Lines架设电话线的更多相关文章
- BZOJ1614: [Usaco2007 Jan]Telephone Lines架设电话线
1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 892 Solved: ...
- BZOJ 1614: [Usaco2007 Jan]Telephone Lines架设电话线
题目 1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec Memory Limit: 64 MB Description Farm ...
- [Usaco2007 Jan]Telephone Lines架设电话线(最短路,二分)
[Usaco2007 Jan]Telephone Lines架设电话线 Description FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向 ...
- [Usaco2007 Jan]Telephone Lines架设电话线[二分答案+最短路思想]
Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...
- 【bzoj1614】[Usaco2007 Jan]Telephone Lines架设电话线 二分+SPFA
题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1 ...
- 【bzoj1614】[Usaco2007 Jan]Telephone Lines架设电话线
题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N < ...
- BZOJ——1614: [Usaco2007 Jan]Telephone Lines架设电话线
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1930 Solved: 823[Submit][Status][Discuss] Description ...
- 【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
对于二分出的答案x而言,验证答案等价于将所有边权>x的边赋成1,否则赋成0,然后判断从1到n的最短路是否<=K. #include<cstdio> #include<cs ...
- BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线:spfa + 二分【路径中最大边长最小】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1614 题意: 给你一个无向图,n个点,m条边. 你需要找出一条从1到n的路径,使得这条路径 ...
随机推荐
- synchronized实现原理及ReentrantLock源码
synchronized synchronized的作用范围 public class SynchronizedTest { // 实例方法,方法访问标志ACC_SYNCHRONIZED,锁对象是对象 ...
- 精尽Spring MVC源码分析 - HandlerAdapter 组件(二)之 ServletInvocableHandlerMethod
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- css 07-浮动
07-浮动.md #文本主要内容 标准文档流 标准文档流的特性 行内元素和块级元素 行内元素和块级元素的相互转换 浮动的性质 浮动的清除 浏览器的兼容性问题 浮动中margin相关 关于margin的 ...
- 听说特斯拉花了4个月研发出新ERP,然后很多人都疯了
欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 最近这件事儿在SAP圈里炒的挺火的,最主要是因为这几个关键词: 放弃SAP.4个月.自研ERP: 这则新闻一出来,很多人都兴高采烈,都要疯了 ...
- Java安全之Shiro 550反序列化漏洞分析
Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...
- 通过PHP代码将大量数据插入到Sqlite3
PHP代码 读入txt文件,并写入到sqlite数据库里 <?php date_default_timezone_set('PRC'); $pdo = new PDO('sqlite:db/qq ...
- 点名小辣辣,带你入门 JMeter (。・∀・)ノ゙
什么是 JMeter Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测 试但后来扩展到其他测试领域. 它可以用于测试静态 ...
- 怎么判断map不为空
public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...
- 冰河又一MySQL力作出版(文末送书)!!
写在前面 继<海量数据处理与大数据技术实战>之后,冰河的又一力作<MySQL技术大全:开发.优化与运维实战>出版,相信这本书对任何想系统学习MySQL的小伙伴来说,都会带来实质 ...
- python谷歌序列化传输
今日破解某app加密app当中用到了谷歌序列化传输 1.请求序列化文件 # Generated by the protocol buffer compiler. DO NOT EDIT! # sour ...