【hiho38】二分•二分答案

题目描述

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

在上一回和上上回里我们知道Nettle在玩《艦これ》,Nettle在整理好舰队之后终于准备出海捞船和敌军交战了。
在这个游戏里面,海域是N个战略点(编号1..N)组成,如下图所示



其中红色的点表示有敌人驻扎,猫头像的的点表示该地图敌军主力舰队(boss)的驻扎点,虚线表示各个战略点之间的航线(无向边)。
在游戏中要从一个战略点到相邻战略点需要满足一定的条件,即需要舰队的索敌值大于等于这两点之间航线的索敌值需求。
由于提高索敌值需要将攻击机、轰炸机换成侦察机,舰队索敌值越高,也就意味着舰队的战力越低。
另外在每一个战略点会发生一次战斗,需要消耗1/K的燃料和子弹。必须在燃料和子弹未用完的情况下进入boss点才能与boss进行战斗,所以舰队最多只能走过K条航路。
现在Nettle想要以最高的战力来进攻boss点,所以他希望能够找出一条从起始点(编号为1的点)到boss点的航路,使得舰队需要达到的索敌值最低,并且有剩余的燃料和子弹。

特别说明:两个战略点之间可能不止一条航线,两个相邻战略点之间可能不止一条航线。保证至少存在一条路径能在燃料子弹用完前到达boss点。
提示:你在找什么?

输入

第1行:4个整数N,M,K,T。N表示战略点数量,M表示航线数量,K表示最多能经过的航路,T表示boss点编号, 1≤N,K≤10,000,N≤M≤100,000
第2..M+1行:3个整数u,v,w,表示战略点u,v之间存在航路,w表示该航路需求的索敌值,1≤w≤1,000,000。

输出

第1行:一个整数,表示舰队需要的最小索敌值。

样例输入

5 6 2 5

1 2 3

1 3 2

1 4 4

2 5 2

3 5 5

4 5 3

样例输出

3

 



解题思路

#1. 首先,理解题意。 

本题题意:给出一张带有边权值的无向图,返回从起点(编号为1)到终点(编号T,输入给出)中经过的所有的路径中最长路段的最小值。

好像有点绕,举样例的例子说明,首先作图如下:



1号节点是起点,5号是终点,从1到5有三条通路:1->2->5; 1->3->5; 1->4->5; 对应路径中最长的路段长度分别是:3;5;4;因此在{3,5,4}中最小值3是正确值。


#2. 寻找合适的方法。

空间复杂度。

N的最大值10,000,如果用邻接矩阵直接存,肯定要爆掉! 计算如下:

 4bit(1个int占用4bit内存)*10000*10000/(1024*1024) > 381MB > 256MB 
而且M最大值100,000,也就意味着这是一幅稀疏图,显然要用邻接表结构存图。

时间复杂度。

好吧,其实我是不太会分析的。。。留空先。

但是呢,暴力搜索,即使加了基本的剪枝还是会TLE的。


算法设计。

本题还有一个特点,就是最后的答案肯定 小于 输入给出的所有边权值的最大值。that is to say,答案其实就在输入的边权值中。这样一类题目的常用方法往往是最大值(答案上限)和最小值(答案下限)中二分。


结合来看,在二分答案后,检查能不能在图中找到这样的一条路径,其中路段最大值小于或等于这个“答案”。

bfs和转化为最短路都是可以做的。 前者很简单,后者需要转化下边权值。


恩,就是这样!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值