二分答案

首先,最大值最小,就是二分答案

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 10005;
int head[MAXN], nume, n, m, k, l, r, mid, dis[MAXN];
bool f[MAXN];
struct edge {
int to, nxt, dis;
}e[MAXN << 1];
void adde(int from, int to, int dis) {
e[++nume].to = to;
e[nume].nxt = head[from];
e[nume].dis = dis;
head[from] = nume;
}
queue <int> q;
bool chk(int x) {
memset(dis, 0x3f, sizeof(dis));
memset(f, 0, sizeof(f));
dis[1] = 0;
q.push(1);
while(!q.empty()) {
int u = q.front();q.pop();
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
int t = (e[i].dis > x);
if(dis[v] > dis[u] + t) {
dis[v] = dis[u] + t;
q.push(v);
}
}
}
//cout << dis[n] << endl;
return (dis[n] <= k);
}
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= m; i++ ){
int u, v, di;
cin >> u >> v >> di;
r = max(r, di);
adde(u, v, di); adde(v, u, di);
}
int t = r;
while(l <= r) {
mid = (l + r) >> 1;
//printf("%d %d %d\n", l, r, mid);
if(chk(mid)) {
r = mid - 1;
}else l = mid + 1;
}
if(l <= t) cout << l << endl;
else cout << -1 << endl;
return 0;
}

还可以用 DP 的思路, 在SPFA中转移

也可以对于每种情况,建点连边,跑最短路

最新文章

  1. ASP.NET Core 中文文档 第四章 MVC(3.7 )局部视图(partial)
  2. 将页面打印成excel
  3. 关于win10输入法问题(打不出中文)解决方法
  4. webservice 简单入门 (NLY)
  5. bootstrap入门-4.排版及其他固定样式
  6. Sqlserver日期函数应用
  7. NSQ部署
  8. 浅谈w3c标准
  9. Windows vista以上模拟Alt Ctrl Delete
  10. CSS格式与布局中三种位置的理解与应用
  11. 浅析Java RTTI 和 反射的概念
  12. jQuery(一)、核心
  13. Python:笔记2
  14. React-Native之轮播组件looped-carousel的介绍与使用
  15. JS_高程3.基本概念(6)函数
  16. 剑指offer(43)左旋转字符串
  17. jdbc连接 orale 和 mysql 所需要的jar包
  18. [转] CSSOM视图模式(CSSOM View Module)相关整理
  19. MVC ——设置启动 URL
  20. 可视化库-seaborn-多变量分析绘图(第五天)

热门文章

  1. Dojo操作dom元素的样式
  2. java基础—super关键字
  3. ORACLE的SQL JOIN方式大全
  4. 01_6_Struts_ActionWildcard_通配符配置
  5. 【转】PCA for opencv
  6. Spring AOP注解形式简单实现
  7. destoon模块自定义字段的添加并让其支持搜索的方法
  8. python爬虫基础18-Chrome调试前端工具
  9. drf 频率组件 META字典详情
  10. statistics-skewed data