#\(\mathcal{\color{red}{Description}}\)

\(Link\)

给定一个图,请你求出在把其中自由选择的\(k\)条的权值都置为零的情况下,图中\(1-N\)最短路上的最大边权的最小值。

#\(\mathcal{\color{red}{Solution}}\)

哇这个题真是吊打我的智商啊…

首先我们看题目中给的限制条件,限制我们不能直接\(sort\)一遍的条件就是我们要找的是最短路上的边权最大值最小限制了我们把一些边的权值置为零之后,图上的最短路。而这个最短路的情况比较复杂,因为你不可以静态删边,\(DP\)的话应该可以,但是\(DP\)起来不容易定义状态并且转移较麻烦其实就是我不会。所以我们考虑把每种合法的状态都枚举一遍,得出\(min\)。但是比较显然的是,由于结果具有某种意义上的单调性,所以我们可以二分。

那怎么二分呢?我们可以考虑二分一条扫描线,把大于这条边的边权都设成\(1\),小于的都设成\(0\)。如果\(SPFA\)出来的结果\(\leq K\)的话,那这就是一种合法的方案;否则不合法。

然后就二分就行了惹~

  1. // luogu-judger-enable-o2
  2. #include <queue>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <iostream>
  6. #define to(k) e[k].to
  7. using namespace std ;
  8. const int MAXN = 12050 ;
  9. struct edge{
  10. int to, next, v ;
  11. }e[MAXN << 1] ;
  12. queue<int> q ;
  13. int head[MAXN << 1], cnt, dist[MAXN], i, k, ct ;
  14. int l, r, mid, a, b, c, N, M, K, vis[MAXN], now ;
  15. inline void init(){
  16. memset(dist, 0x3f, sizeof(dist)), memset(vis, 0, sizeof(vis)) ;
  17. queue<int> emt ; swap(q, emt), q.push(1), vis[1] = 1, dist[1] = 0 ;
  18. }
  19. inline bool check(int x){
  20. init() ;
  21. while(!q.empty()){
  22. now = q.front(), q.pop(), vis[now] = 0 ;
  23. for(k = head[now]; k ; k = e[k].next){
  24. ct = (e[k].v > x ? 1 : 0) ;
  25. if(dist[to(k)] > dist[now] + ct){
  26. dist[to(k)] = dist[now] + ct ;
  27. if(!vis[to(k)]){
  28. vis[to(k)] = 1 ;
  29. q.push(to(k)) ;
  30. }
  31. }
  32. }
  33. }
  34. if(dist[N] > K) return 0 ; return 1 ;
  35. }
  36. inline void add(int u, int v, int w){
  37. e[++cnt].to = v, e[cnt].v = w ;
  38. e[cnt].next = head[u], head[u] = cnt ;
  39. }
  40. int main(){
  41. cin >> N >> M >> K ;
  42. for(i = 1; i <= M; i ++){
  43. cin >> a >> b >> c ;
  44. add(a, b, c), add(b, a, c) ;
  45. }l = 0, r = 1000000 ;
  46. while(l < r){
  47. mid = (l + r) >> 1 ;
  48. if(check(mid)) r = mid ;
  49. else l = mid + 1 ;
  50. }
  51. if(l == 1000000) cout << -1 ;
  52. else cout << l ;
  53. }

幕后花絮:这道题由于我忘了判\(-1 +\)空间开小导致挂了好多次……真是\(GG\)

[USACO08JAN]电话线$Telephone \ \ Lines$(图论$+SPFA+$ 二分答案)的更多相关文章

  1. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 最短路+二分答案

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1948 [USACO08JAN]电话线Telephone ...

  2. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines

    P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...

  3. 洛谷P1948 [USACO08JAN]电话线Telephone Lines

    题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is u ...

  4. [USACO08JAN]电话线Telephone Lines

    多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人.该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话线杆,任意 ...

  5. bzoj 1614 Telephone Lines架设电话线 - 二分答案 - 最短路

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  6. 题解【洛谷P1948】[USACO08JAN]电话线Telephone Lines

    题面 题解 很显然,答案满足单调性. 因此,可以使用二分答案求解. 考虑\(check\)的实现. 贪心地想,免费的\(k\)对电话线一定都要用上. 每次\(check\)时将小于\(mid\)的边权 ...

  7. P1948 [USACO08JAN]电话线Telephone Lines

    传送门 思路: 二分+最短路径:可以将长度小于等于 mid 的边视为长度为 0 的边,大于 mid 的边视为长度为 1 的边,最后用 dijkstra 检查 d [ n ] 是否小于等于 k 即可. ...

  8. [Usaco2007 Jan]Telephone Lines架设电话线[二分答案+最短路思想]

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  9. P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)

    思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...

  10. 【SPFA+二分答案】BZOJ1614- [Usaco2007 Jan]Telephone Lines架设电话线

    沉迷于刷水 以前的那个二分写法过不了QAQ 换了一种好像大家都比较常用的二分.原因还不是很清楚. [题目大意] 给出一张图,可以将其中k条边的边权减为0,求1到n的路径中最长边的最小值. [思路] 二 ...

随机推荐

  1. 理解ResourceBundle.getBundle("dataSourceFactory")

    最近在项目文件中看到这样的代码一下子还看不懂 经过他人指点和自己百度,总算明白大致用处. 首先这个方法时java.util的内置方法,主要功能是用于解析properties文件的. ResourceB ...

  2. jquery获取哪一个下拉框被选中

    var val = $("select[name='type_irb'] option:selected").val();

  3. Liunx一些命令

    1.设置管理员的密码:sudo passwd root2.获取管理员权限su root3.查看IP地址sudo ifconfig -a4.创建一个文件sudo touch test.txt5.创建一个 ...

  4. Javascript 中正则表达式验证网址

    其中ItemURL是需要验证的网址数据

  5. C#基础-for循环执行顺序

    for(表达式1;表达式2;表达式3) {循环体} 执行顺序:1-表达式1赋值 2-判断表达式2是否为真 3-表达式2如果为否跳出for循环,如果为真执行循环体 4-执行表达式3 5-判断表达式2继续 ...

  6. Java设计模式—命令模式

    命令模式是一个高内聚的模式. 定义如下:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 通用类图如下: 角色说明: ● Re ...

  7. Monitorix:一款面向Linux的轻型系统和网络监测工具

    Monitorix是一款功能非常强大的免费开源轻型工具,目的在于监测Linux中的系统和网络资源.它可以定期收集系统和网络数据,并使用自己的Web界面,通过图形显示相关信息.Monitorix让用户可 ...

  8. Python爬虫教程-11-proxy代理IP,隐藏地址(猫眼电影)

    Python爬虫教程-11-proxy代理IP,隐藏地址(猫眼电影) ProxyHandler处理(代理服务器),使用代理IP,是爬虫的常用手段,通常使用UserAgent 伪装浏览器爬取仍然可能被网 ...

  9. LoadRunner对移动互联网后端服务器压力测试

    一.LoadRunner简介 LoadRunner,是惠普公司研发的一款预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够 ...

  10. linux 下的python的最佳打开方式, you know?

    IPython install IPython是Python的交互式Shell,提供了代码自动补完,自动缩进,高亮显示,执行Shell命令等非常有用的特性.特别是它的代码补完功能,例如:在输入zlib ...