<题目链接>

题目大意:

在一个节点标号为1~n的无向图中,求出一条1~n的路径,使得路径上的第K+1条边的边权最小。

解题分析:
直接考虑情况比较多,所以我们采用二分答案,先二分枚举第K+1条路的边权,然后根据枚举的边权,重新建图。因为john只需要支付除K条边之后权值最大的边,所以对于所有边权小于等于枚举边的,将其边权置为0,对于那些大于枚举边权的边,边权则置为1,这样,对1~n跑最短路,就能够用于判断枚举的答案是否成立。因为建的是边权为0、1的图求最短路,所以也可以用双端队列实现的BFS求解。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. #define clr(a,b) memset(a,b,sizeof(a))
  8. #define rep(i,s,t) for(int i=s;i<=t;i++)
  9. #define pb push_back
  10. const int N = 1e3+, M = 1e4+;
  11. const int INF = 0x3f3f3f3f;
  12. int n,m,k,cnt,head[N],vis[N];
  13. struct Edge{
  14. int to,nxt,val;
  15. }edge[M<<];
  16.  
  17. struct Ege{ //记录下初始输入边的个数
  18. int x,y,w;
  19. Ege(int _x=,int _y=,int _w=):x(_x),y(_y),w(_w){}
  20. };
  21. vector<Ege>vec;
  22.  
  23. struct Node{
  24. int dist,loc;
  25. Node(int _dist=,int _loc=):dist(_dist),loc(_loc){}
  26. bool operator <(const Node &tmp)const{ return dist>tmp.dist; }
  27. }node[N];
  28.  
  29. void init(){
  30. cnt=;clr(head,-);
  31. }
  32. void addedge(int u,int v,int w){
  33. edge[++cnt].to=v,edge[cnt].val=w;
  34. edge[cnt].nxt=head[u],head[u]=cnt;
  35. }
  36. void Getmap(int x){
  37. init();
  38. for(int i=;i<vec.size();i++){
  39. Ege now=vec[i];
  40. int u=now.x,v=now.y,w=now.w;
  41. if(w<=x)addedge(u,v,),addedge(v,u,); //将花费<=k的道路边权置0,因为john只需要支付最大的道路
  42. else addedge(u,v,),addedge(v,u,); //大于的边置为1,免费的k条边是否能够在满足题目条件的情况下,连通1~n点
  43. }
  44. }
  45. bool check(int x){
  46. Getmap(x); //根据枚举的答案,建立0、1图,然后在这个0、1图上跑最短路
  47. priority_queue<Node>q;
  48. for(int i=;i<=n;i++){
  49. vis[i]=,node[i].loc=i,node[i].dist=INF;
  50. }
  51. node[].dist=;
  52. q.push(node[]);
  53. while(q.size()){
  54. int u=q.top().loc;q.pop();
  55. if(vis[u])continue;
  56. vis[u]=;
  57. for(int i=head[u];~i;i=edge[i].nxt){
  58. int v=edge[i].to;
  59. if(node[v].dist>node[u].dist+edge[i].val){
  60. node[v].dist=node[u].dist+edge[i].val;
  61. q.push(node[v]);
  62. }
  63. }
  64. }
  65. if(node[n].dist<=k)return true;
  66. return false;
  67. }
  68. int main(){
  69. while(scanf("%d%d%d",&n,&m,&k)!=EOF){
  70. rep(i,,m){
  71. int u,v,w;scanf("%d%d%d",&u,&v,&w);
  72. vec.pb(Ege(u,v,w));
  73. }
  74. int l=,r=1e6+,ans=-;
  75. while(l<=r){ //二分答案,枚举john需要支付的钱数,即连通1~n的道路中,除k条路外,花费最大的路径
  76. int mid=l+r>>;
  77. if(check(mid))ans=mid,r=mid-;
  78. else l=mid+;
  79. }
  80. printf("%d\n",ans);
  81. }
  82. }

2019-03-06

POJ 3662 Telephone Lines【二分答案+最短路】||【双端队列BFS】的更多相关文章

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

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

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

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

  3. poj-3662 Telephone Lines 二分答案+最短路

    链接:洛谷 POJ 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone co ...

  4. POJ 3662 Telephone Lines (二分+Dijkstra: 最小化第k大的值)

    题意 Farmer John想从电话公司修一些电缆连接到他农场.已知N个电线杆编号为1,2,⋯N,其中1号已经连接电话公司,N号为农场,有P对电线杆可连接. 现给出P对电线杆距离Ai,Bi,Li表示A ...

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

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

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

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

  7. POJ 3662 Telephone Lines(二分答案+SPFA)

    [题目链接] http://poj.org/problem?id=3662 [题目大意] 给出点,给出两点之间连线的长度,有k次免费连线, 要求从起点连到终点,所用的费用为免费连线外的最长的长度. 求 ...

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

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

  9. POJ - 3662 Telephone Lines (Dijkstra+二分)

    题意:一张带权无向图中,有K条边可以免费修建.现在要修建一条从点1到点N的路,费用是除掉免费的K条边外,权值最大的那条边的值,求最小花费. 分析:假设存在一个临界值X,小于X的边全部免费,那么此时由大 ...

随机推荐

  1. Confluence 6 使用 CSS 样式化 Confluence 的介绍

    这个页面对 Confluence 通过修改 CSS 来改变外观和感觉的情况进行了说明. 层叠样式表(Cascading Style Sheets (CSS))是对 Web 页面进行样式化的工业化标准. ...

  2. django rest framework(3)

    目录 一.版本 二.解析器 三.序列化 四.请求数据验证 一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. class ...

  3. vue中引入css文件

    两种方式引入css文件,一种是直接在main.js中引入(也可以在其他的.vue文件中的<script></script>标签中),即下面这种写法: import 'eleme ...

  4. Play框架--初学笔记

    目录结构 web_app 根目录 | sbt SBT Unix 批处理脚本用于启动sbt-launch.jar | sbt.bat SBT Windows 批处理脚本用于启动sbt-launch.ja ...

  5. PAT Basic 1069. 微博转发抽奖(20)

    小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整数M(<= 1000).N ...

  6. NHibernate:no persister for 异常

    几种原因: 1.配置文件后缀名写错 mapping file 必须是.hbm.xml结尾 2.Web.config配置里面引用实体 <session-factory> .......... ...

  7. C#矩阵求逆

    来源:http://zhidao.baidu.com/link?url=DiqAbq9YUYn3z7QjxGGoF0PLZwN-Y9ecqKB7Gy38JWRD1riMIYukVKXKq88pxtWL ...

  8. oracle安装过程中先决条件检查失败的解决办法

    1:公司数据库开始用的mysql,因为公司做的是保密性项目,所以就在项目日志过多的时候项目有爆炸的迹象啊(3000千万数据,貌似mysql有点撑不住).然后组长开始让我安装oracle,公司的内网也是 ...

  9. TagCanvas 插件

    TagCanvas是一个基于HTML5 Canvas技术开发的标签云动画.还提供一个以jQuery插件形式实现的版本. 它支持文本和图片两种格式,能够以Sphere, hcylinder 或 vcyl ...

  10. CentOS下配置SFTP操作日志

    1.修改ssh的配置 vi /etc/ssh/sshd_config 在36行左右修改如下配置 Subsystem sftp /usr/libexec/openssh/sftp-server -l I ...