当前位置: 首页 > news >正文

二分,Dijkstra,340. 通信线路

在郊区有 N 座通信基站,P 条 双向 电缆,第 i 条电缆连接基站 Ai 和 Bi。

特别地,1 号基站是通信公司的总站,N 号基站位于一座农场中。

现在,农场主希望对通信线路进行升级,其中升级第 i 条电缆需要花费 Li。

电话公司正在举行优惠活动。

农产主可以指定一条从 1 号基站到 N 号基站的路径,并指定路径上不超过 K 条电缆,由电话公司免费提供升级服务。

农场主只需要支付在该路径上剩余的电缆中,升级价格最贵的那条电缆的花费即可。

求至少用多少钱可以完成升级。

输入格式

第 11 行:三个整数 N,P,K

第 2..P+12.. 行:第 i+1 行包含三个整数 Ai,Bi,Li

输出格式

包含一个整数表示最少花费。

若 11 号基站与 N� 号基站之间不存在路径,则输出 −1−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

 解析:

(此题还可用最短路中的分层图解,详情请看最短路分栏spfa,分层图,340. 通信线路,《算法竞赛进阶指南》_Landing_on_Mars的博客-CSDN博客)

详细思路请参考AcWing 340. 通信线路(二分答案+dijkstra) - AcWing

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
const int N = 1e3 + 5;
int n, m, k;
vector<pair<int, int>>G[N];
int d[N], v[N];typedef struct st {int u, w;
}st;bool operator>(const st& a, const st& b) {return a.w > b.w;
}int dij(int w) {memset(d, 0x3f3f3f3f, sizeof(d));memset(v, 0, sizeof(v));priority_queue<st, vector<st>, greater<st>>q;q.push({ 1,0 });d[1] = 0;int t;while (!q.empty()) {t = q.top().u;q.pop();if (v[t])continue;v[t] = 1;for (int i = 0; i < G[t].size(); i++) {int j = G[t][i].first, dist = G[t][i].second>w?1:0;if (d[j] > d[t] + dist) {d[j] = d[t] + dist;q.push({ j,d[j] });}}}if (d[n] == 0x3f3f3f3f)return d[n];return d[n] <= k;
}int main() {cin >> n >> m >> k;for (int i = 1,a,b,t; i <= m; i++) {scanf("%d%d%d", &a, &b, &t);G[a].push_back({ b,t });G[b].push_back({ a,t });}int l = 0, r = 10, mid,ans=0,tt;while (l<=r) {mid = l + (r - l) / 2;tt = dij(mid);if (tt == 0x3f3f3f3f) {cout << -1 << endl;break;}if (tt) {r = mid-1;}else {l = mid+1;ans = mid;}}if (tt != 0x3f3f3f3f)cout << ans << endl;return 0;
}

http://www.lryc.cn/news/153024.html

相关文章:

  • Stable Diffusion---Ai绘画-下载-入门-进阶(笔记整理)
  • Java 乘等赋值运算
  • 【性能优化】聊聊性能优化那些事
  • k8s 查看加入主节点命令 k8s重新查看加入节点命令 k8s输入删除,重新查看加入命令 kuberadm查看加入节点命令
  • Scalene:Python CPU+GPU+内存分析器,具有人工智能驱动的优化建议
  • C语言练习8(巩固提升)
  • Java匿名内部类
  • Shiro和SpringSecurity的区别
  • 【STM32】学习笔记(OLED)
  • 概念解析 | 认知雷达:有大脑的雷达
  • B. Long Long
  • CTFhub-文件上传-.htaccess
  • Python中的绝对和相对导入
  • C语言关于与运算符
  • 计算机网络(速率、宽带、吞吐量、时延、发送时延)
  • kubectl入门
  • Android JNI系列详解之ndk-build工具的使用
  • 【业务功能篇90】微服务-springcloud-检索服务-ElasticSearch实战运用-DSL语句
  • QTday4
  • 设计模式之命令模式(Command)的C++实现
  • 取证工具prodiscover的基本操作
  • flutter plugins插件【二】【FlutterAssetsGenerator】
  • 看懂UML类图
  • keras深度学习框架通过简单神经网络实现手写数字识别
  • React 中的 ref 如何操作 dom节点,使输入框获取焦点
  • 最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版)
  • AK 微众银行 9.3 笔试 Java后端方向
  • 了解java中的通配符“?“
  • 浙大陈越何钦铭数据结构07-图6 旅游规划【最小堆实现】
  • OpenShift 4 - 用 Prometheus 和 Grafana 监视用户应用定制的观测指标(视频)