[题目]: https://www.luogu.org/problemnew/show/P1462

题意

题目是给定了一张双向边,有边权的图,然后让我们求出一个最小值,满足一条路径上的最大的费用小于这个最小值且这条路径的所损失的血量不超过总血量。

思路

往往这种求最大值的最小值一般就是二分,然后写个check函数来判断这个最小值是否满足条件,如果不满足条件,就扩大范围,而如果满足条件的话就缩小范围,直到满足条件。

所以我们就可以二分一个值\(h\)(二分边界是起点的费用到所有点的费用最大值),跑最短路,并且在跑最短路的时候,每次松弛操作时,都要满只有费用<=\(h\)的点才可以进行松弛。但是这个点的坑点和数据太弱,建议做完了这道题可以去挑战一波数据加强版——

做这个题的时候要注意每次二分时都需要判断u,v的费用是否满足条件,然后我们需要寻找到最大值,所以要使用不记录二分法。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
long long lin[1000100], data[1000100], vis[1000100];
long long n, m, b, maxn, cnt, u, v;
struct edge {
long long from, to, len, nex;
}e[200010];
struct cym {
long long len, num;
}dis[1000010];
bool operator < (cym a, cym b)
{
return a.len > b.len;
}
inline void add(long long u, long long v, long long l)
{
e[++cnt].from = u;
e[cnt].to = v;
e[cnt].len = l;
e[cnt].nex = lin[u];
lin[u] = cnt;
}
using std :: priority_queue;
using std :: max;
priority_queue <cym> q;
bool check(long long h)
{
memset(vis, 0, sizeof(vis));
if (data[u] > h || data[v] > h)
return false;
for (int i = 1; i <= n; i++)
dis[i].len = 2147483647, dis[i].num = i;
dis[u].len = 0;
q.push(dis[u]);
while(!q.empty())
{
cym cur = q.top();
q.pop();
if (vis[cur.num] || data[cur.num] > h)
continue;
vis[cur.num] = 1;
for (int i = lin[cur.num]; i; i = e[i].nex)
if (dis[e[i].to].len > cur.len + e[i].len && data[e[i].to] <= h && !vis[e[i].to])
{
dis[e[i].to].len = cur.len + e[i].len;
q.push(dis[e[i].to]);
}
}
if (dis[v].len > b)
return false;
else
return true;
}
inline void binary_search()
{
long long l = 1, r = maxn;
long long mid = (l + r) >> 1;
while (l <= r)
{
mid = (l + r) >> 1;
if (check(mid))
r = mid - 1;
else
l = mid + 1;
}
if (l == 0)
printf("-1");
else
printf("%lld", l);
}
signed main()
{
// freopen("roa.in", "r", stdin);
// freopen("roa.out", "w", stdout);
scanf("%lld%lld%lld%lld%lld", &n, &m, &u, &v, &b);
for (long long i = 1; i <= n; i++)
scanf("%d", &data[i]), maxn = max(maxn, data[i]);
for (long long i = 1; i <= m; i++)
{
long long a, b, c;
scanf("%lld%lld%lld", &a, &b, &c);
add(a, b, c);
add(b, a, c);
}
if (!check(2147483647))
{
printf("-1");
return 0;
}
binary_search();
return 0;
}

洛谷P1462通往奥格瑞玛的道路题解的更多相关文章

  1. 洛谷 P1462 通往奥格瑞玛的道路 题解

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  2. 洛谷P1462 通往奥格瑞玛的道路 题解 最短路+二分答案

    题目链接:https://www.luogu.com.cn/problem/P1462 题目大意: 有 \(n\) 个点 \(m\) 条边,每个点有一个点权,每个边有一个边权.求所有长度不超过 \(b ...

  3. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

  4. 洛谷 P1462 通往奥格瑞玛的道路 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  5. 洛谷——P1462 通往奥格瑞玛的道路

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  6. 洛谷 P1462 通往奥格瑞玛的道路

    洛谷 题意:要求在限定油耗内,求最小花费的最大值. 求最小值最大很容易想到二分答案.所以我们往二分的方向去想. 我们二分一个费用,然后要保证到终点时满足限定油耗,所以跑最短路. 不过松弛条件要改一下: ...

  7. 洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 && spfa (存多条边示例)

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  8. 洛谷P1462 通往奥格瑞玛的道路[二分答案 spfa 离散化]

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  9. 洛谷P1462 通往奥格瑞玛的道路

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

随机推荐

  1. 03 Django REST Framework 视图和路由

    01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...

  2. JS典记

        var href = "";     //遍历a标签     $ ( "a"). each (function () {         href = ...

  3. 【转】Restful是什么

    REST的概念是什么 维基百科  表现层状态转换(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士论文 ...

  4. CI框架在模型中切换读写库和读写库

    如果你想在控制器中切换在application/config/database.php中配置好的数据库group,那么你可以参考这篇博客:CI框架在控制器中切换读写库和读写库 如果你是希望在模型中切换 ...

  5. window端编码到Linux允许脚本 笔记

    昨天升级一个服务,发现没有现成的启动脚本.就随手写了一个,一运行发现不行.竟然报错说找不到文件,No such file or directory [nohup: cannot run command ...

  6. LR 两种html与url录制

    一直在使用LR,对于Html_based script和Url-based script 两种录制方式之间,要如何选择,仍是一知半解.最近测试时遇到同样的业务功能,两种录制方式的脚本,单次执行时间差别 ...

  7. h5-canvas(其他api)

    ###1.使用图片(需要image对象) drawImage(image,x,y,width,height) 其中image是image或者canvas对象,x和y 是其在目标canvas的起始坐标 ...

  8. ES6学习之let

    块级作用域 ; i < ; i++){} console.log(i); ; j < ; j++){} console.log(j); //"ReferenceError: j ...

  9. 转:MD5(Message-Digest Algorithm 一种哈希算法)

    什么是MD5算法 MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash val ...

  10. CRM系统数据授权

    1.新建角色,华东二区 2.业务对象中找到客户管理 3.在数据范围中新建数据规则,并进行设置 4.点击授权后,生效. 另:数据权限设置