AcWing 340. 通信线路 (一本通 架设电话线)
// 通信线路.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://www.acwing.com/problem/content/342/
在郊区有 N 座通信基站,P 条 双向 电缆,第 i 条电缆连接基站 Ai 和 Bi。
特别地,1 号基站是通信公司的总站,N 号基站位于一座农场中。
现在,农场主希望对通信线路进行升级,其中升级第 i 条电缆需要花费 Li。
电话公司正在举行优惠活动。
农产主可以指定一条从 1 号基站到 N 号基站的路径,并指定路径上不超过 K 条电缆,由电话公司免费提供升级服务。
农场主只需要支付在该路径上剩余的电缆中,升级价格最贵的那条电缆的花费即可。
求至少用多少钱可以完成升级。
输入格式
第 1 行:三个整数 N,P,K。
第 2..P+1 行:第 i+1 行包含三个整数 Ai,Bi,Li。
输出格式
包含一个整数表示最少花费。
若 1 号基站与 N 号基站之间不存在路径,则输出 −1。
数据范围
0≤K<N≤1000,
1≤P≤10000,
1≤Li≤1000000
输入样例:
5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6
输出样例:
4
6 4 1
6 4 1
3 6 7
3 2 4
6 2 5
*/
#include <iostream>
#include <algorithm>
#include <queue>
#include <memory.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 1010;
const int M = 20010;
int h[N], e[M], ne[M], w[M], idx;
int dist[N];
int st[N];
int n, m, k;
//二分线段费用 大于这个费用就是1 小于这个费用就是0
//求最短路 然后看n的最短路径是否为k 那么费用就是这个值
void add(int a, int b, int l) {
e[idx] = b, w[idx] = l, ne[idx] = h[a], h[a] = idx++;
}
bool check(int limit) {
memset(dist, 0x3f, sizeof dist);
memset(st, 0, sizeof st);
dist[1] = 0;
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({ 0, 1 }); // first存储距离,second存储节点编号
while (heap.size())
{
auto t = heap.top();
heap.pop();
int ver = t.second, distance = t.first;
if (st[ver]) continue;
st[ver] = true;
for (int i = h[ver]; i != -1; i = ne[i])
{
int j = e[i]; int len = 1;
if (w[i] <= limit) len =0; // 费用大于限制就不考虑了
if (dist[j] > distance +len)
{
dist[j] = distance + len;
heap.push({ dist[j], j });
}
}
}
return dist[n] <= k;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m >> k;
for (int i = 0; i < m; i++) {
int a, b, l; cin >> a >> b >> l;
add(a, b, l); add(b, a, l);
}
int l = 0; int r = 1000001;
while (l < r) {
int mid = (l + r) >> 1;
if (check(mid)) {
r = mid;
}
else {
l = mid + 1;
}
}
if (l == 1000001) l = -1;
cout << l << endl;
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力

