题意

Farmer John想从电话公司修一些电缆连接到他农场。已知N个电线杆编号为1,2,⋯N,其中1号已经连接电话公司,N号为农场,有P对电线杆可连接。

现给出P对电线杆距离Ai,Bi,Li表示Ai和Bi可连接,需要长度为Li的电缆。

电话公司赞助FJ K条免费电缆,额外的支出为剩下所需电缆的最大长度。求出最小费用。

思路

设mid为某条线的长度,长于mid的线放到免费额度里,否则自己掏钱。如果存在一个临界值x,使得长于x的电线数量恰好等于K,这个临界值对应的解就是最优解。如何计算长于mid的电线数量呢?排序比较肯定不行的,因为不知道这条电线用不用得上。所以需要Dijkstra,又因为在mid固定的条件下,电线的花费只取决于长度是否大于mid,所以可以将大于的取为1,小于的取为0。这样花费就可以计算了,并且花费等于长于mid的电线数量,也就是需要自己掏钱的电线的数量。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <queue>
  5. #include <cstring>
  6. using namespace std;
  7. int N, P, K;
  8. struct edge { // 顶点属性
  9. int to, length;
  10. edge(int to, int length) : to(to), length(length) {}
  11. bool operator<(const edge &b) const {
  12. return length > b.length;
  13. }
  14. };
  15. vector<edge> G[1005];
  16. int d[1005];
  17. bool dijkstra_C(int s, int x) { // 求出长度>x的最少个数(>x边权为1,否则为0,求最短路),判断x是否免费,当二分判定出第一个不免费的x,就是所求的最小的最大x。
  18. priority_queue<edge> que;
  19. memset(d, 0x3f, sizeof(d));
  20. d[s] = 0;
  21. que.push(edge(s, 0));
  22. while (!que.empty()) {
  23. edge p = que.top(); que.pop();
  24. int v = p.to;
  25. if (d[v] < p.length) continue;
  26. for (unsigned int i = 0; i<G[v].size(); ++i) {
  27. edge e = G[v][i];
  28. int len = e.length > x;
  29. if (d[e.to] > d[v] + len) {
  30. d[e.to] = d[v] + len;
  31. que.push(edge(e.to, d[e.to]));
  32. }
  33. }
  34. }
  35. return d[N] <= K;
  36. }
  37. void solve() {
  38. dijkstra_C(1, 1);
  39. if (d[N] == 0x3f3f3f3f) {
  40. printf("-1\n");
  41. return;
  42. }
  43. int lb = -1, ub = 1000000 + 5; // (lb, ub)
  44. while (ub - lb > 1) {
  45. int mid = (lb + ub) >> 1;
  46. if (dijkstra_C(1, mid)) ub = mid; // (lb, ub]
  47. else lb = mid;
  48. }
  49. printf("%d\n", ub);
  50. }
  51. int main() {
  52. scanf("%d%d%d", &N, &P, &K);
  53. int a, b, l;
  54. for (int i = 0; i < P; ++i) {
  55. scanf("%d%d%d", &a, &b, &l);
  56. G[a].push_back(edge(b, l));
  57. G[b].push_back(edge(a, l));
  58. }
  59. solve();
  60. return 0;
  61. }

POJ 3662 Telephone Lines (二分+Dijkstra: 最小化第k大的值)的更多相关文章

  1. POJ 3662 Telephone Lines (二分+dijkstra)

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

  2. poj_3662 最小化第k大的值

    题目大意 有N个节点以及连接的P个无向边,现在要通过这P条边从1号节点连接到N号节点.若无法连接成功,则返回-1:若能够连接成功,那么其中用到了L条边,这L条边中有K条边可以免费,L-K条边不能免费, ...

  3. POJ 3662 Telephone Lines(二分+最短路)

    查看题目 最小化第K大值. 让我怀疑人生的一题目,我有这么笨? #include <cstdio> #include <queue> #include <cstring& ...

  4. POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7214   Accepted: 2638 D ...

  5. (poj 3662) Telephone Lines 最短路+二分

    题目链接:http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total ...

  6. poj 3662 Telephone Lines dijkstra+二分搜索

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5696   Accepted: 2071 D ...

  7. poj 3662 Telephone Lines(最短路+二分)

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6973   Accepted: 2554 D ...

  8. poj 3662 Telephone Lines

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7115   Accepted: 2603 D ...

  9. POJ 3273 Monthly Expense二分查找[最小化最大值问题]

    POJ 3273 Monthly Expense二分查找(最大值最小化问题) 题目:Monthly Expense Description Farmer John is an astounding a ...

随机推荐

  1. dubbo序列化

    序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. dubbo 支持多种序列化方式并且序列化是和协议相对应的.比如:dubbo协议的 dub ...

  2. Keil软仿真STM32

    当使用Keil软仿真STM32时,SystemClock设置为72MHz,使用循环延迟1s钟,实际时间明显大于1S钟,但是Keil调试窗口显示的确实是1s钟//毫秒级的延时void delay_ms( ...

  3. 在安卓上用Termux安装sqlmap

    1.打开Termux执行以下命令 apt update apt install git apt install python2 // 安装sqlmap运行环境 2.从github上下载sqlmap , ...

  4. 标签页QTabWidget

    样式: import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication, QWidget, QTab ...

  5. mysql 案例 ~查询导致的tmp临时文件问题

    一 简介:之前遇到一个tmp分区暴涨的问题,后来经过大神的指点,遂分析写下 二 分类: 1  select语句出现 using temporay tmp 下出现 #sql_631a_1.MYD #sq ...

  6. python - 迭代器(迭代协议/可迭代对象)

    迭代器 # 迭代器协议 # 迭代协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就触发一个 StopIteration 异常,以终止迭代(只能往后走不能往前退) # 可迭代对 ...

  7. Django学习手册 - 正则URL路由配置/路由分发

    ############################################### 总结: 一.url路由配置: 方式一:(通过url链接get获取) 方式二:(url路由匹配方式获取-拓 ...

  8. Linux CentOS 服务器搭建与初始化配置图文详解

    这几天对服务器兴趣贼为浓厚,在虚拟机上装了一个CentOS7玩了玩,遇到过很多问题,比如网卡驱动设置,不能ping 等等问题,然后掏钱买个ECS搭服务器玩玩,下面就开始谢谢我的心路历程吧. 首先 买服 ...

  9. W-GAN系 (Wasserstein GAN、 Improved WGAN)

    学习总结于国立台湾大学 :李宏毅老师 WGAN前作:Towards Principled Methods for Training Generative Adversarial Networks  W ...

  10. Linux内存管理5---物理内存管理

    1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...