POJ - 3662 Telephone Lines (Dijkstra+二分)
题意:一张带权无向图中,有K条边可以免费修建。现在要修建一条从点1到点N的路,费用是除掉免费的K条边外,权值最大的那条边的值,求最小花费。
分析:假设存在一个临界值X,小于X的边全部免费,那么此时由大于等于X的边组成的图,从点1到点N走过的边数小于等于K,那么这个X就是所求的答案。所以可以通过二分答案的方法求解该问题,每一次根据mid值跑迪杰斯特拉,d[i]记录路径长度(走过边的数目)。需要注意的是,要特判一下点1到点N本身不连通的情况以及花费为0的情况。二分的时候,当d[N]>K时修改答案为mid,因为此时能确定最后的结果一定大于等于mid。
- #include<iostream>
- #include<stdio.h>
- #include<cstring>
- #include<queue>
- #include<cmath>
- #include<algorithm>
- #include<vector>
- using namespace std;
- typedef int LL;
- const int maxn =1e3+;
- const int maxm =5e4+;
- const LL INF =0x3f3f3f3f;
- struct Edge{
- int from,to,next;
- LL val;
- bool operator <(const Edge &e) const {return val<e.val;}
- };
- struct HeapNode{
- LL d; //费用或路径
- int u;
- bool operator < (const HeapNode & rhs) const{return d > rhs.d;}
- };
- struct Dijstra{
- int n,m,tot;
- Edge edges[maxm];
- bool used[maxn];
- LL d[maxn];
- int head[maxn];
- void init(int n){
- this->n = n;
- this->tot=;
- memset(head,-,sizeof(head));
- }
- void Addedge(int u,int v ,LL dist){
- edges[tot].to = v;
- edges[tot].val = dist;
- edges[tot].next = head[u];
- head[u] = tot++;
- }
- int dijkstra(int s,int limit){
- memset(used,,sizeof(used));
- priority_queue<HeapNode> Q;
- for(int i=;i<=n;++i) d[i]=INF; //d[i]记录的是到i点走过的权值超过limit的边数
- d[s]=;
- Q.push((HeapNode){,s});
- while(!Q.empty()){
- HeapNode x =Q.top();Q.pop();
- int u =x.u;
- if(d[u]<x.d) continue; //没有更新的必要,不加判断也对,但是慢一点点
- for(int i=head[u];~i;i=edges[i].next){
- int nd = d[u]+(edges[i].val>=limit?:);
- int v = edges[i].to;
- if (d[v] > nd){
- d[v] = nd;
- Q.push({d[v], v});
- }
- }
- }
- return d[n];
- }
- }G;
- #define LOCAL
- int main()
- {
- #ifdef LOCAL
- freopen("in.txt","r",stdin);
- freopen("out.txt","w",stdout);
- #endif
- int N,M,K,u,v,k;
- LL tmp;
- while(scanf("%d%d%d",&N,&M,&K)==){
- G.init(N);
- int maxL = -;
- for(int i=;i<M;++i){
- scanf("%d%d%d",&u,&v,&tmp);
- G.Addedge(u,v,tmp);
- G.Addedge(v,u,tmp);
- if(maxL<tmp) maxL = tmp;
- }
- int res = G.dijkstra(,);
- if(res==INF){
- printf("-1\n");
- continue;
- }
- else if(res<=K){ //先特判一下
- printf("0\n");
- continue;
- }
- int L =,R=maxL,mid,ans;
- while(L<R){
- mid =(L+R)>>;
- if(G.dijkstra(,mid)>K){
- ans = mid; //此时能确定的是:肯定要花费mid的代价
- L = mid+;
- }
- else R =mid-;
- }
- printf("%d\n",ans);
- }
- return ;
- }
POJ - 3662 Telephone Lines (Dijkstra+二分)的更多相关文章
- poj 3662 Telephone Lines dijkstra+二分搜索
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5696 Accepted: 2071 D ...
- POJ 3662 Telephone Lines(二分答案+SPFA)
[题目链接] http://poj.org/problem?id=3662 [题目大意] 给出点,给出两点之间连线的长度,有k次免费连线, 要求从起点连到终点,所用的费用为免费连线外的最长的长度. 求 ...
- POJ 3662 Telephone Lines (二分 + 最短路)
Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncoop ...
- POJ 3662 Telephone Lines【二分答案+最短路】||【双端队列BFS】
<题目链接> 题目大意: 在一个节点标号为1~n的无向图中,求出一条1~n的路径,使得路径上的第K+1条边的边权最小. 解题分析:直接考虑情况比较多,所以我们采用二分答案,先二分枚举第K+ ...
- (poj 3662) Telephone Lines 最短路+二分
题目链接:http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total ...
- POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7214 Accepted: 2638 D ...
- poj 3662 Telephone Lines(最短路+二分)
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6973 Accepted: 2554 D ...
- poj 3662 Telephone Lines
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7115 Accepted: 2603 D ...
- poj 3662 Telephone Lines spfa算法灵活运用
意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...
随机推荐
- QT creator 编辑多个UI 文件 出现 无法解析的外部符号的错误
创建一般的Qt Gui 程序一般会默认一个UI 文件 ,但是随着应用程序窗口的增多,同时编辑多个UI 界面是必须的. 假设我们已经创建好了一个QTUI的工程,里面已经默认了一个UI文件,但是想在添几个 ...
- 第一百五十二节,封装库--JavaScript,表单验证--年月日注入
封装库--JavaScript,表单验证--年月日注入 效果图 html <div id="reg"> <h2 class="tuo"> ...
- android手机有多个摄像头,打开其中一个
方法: private Camera openFrontFacingCameraGingerbread() { int cameraCount = 0; Camera cam = null; Came ...
- 自定义ScrollView 支持添加头部
自定义ScrollView 支持添加头部并且对头部ImageView支持放大缩小,上滑头部缩小,下滑头部显示放大 使用方式: scrollView = (MyScrollView) findViewB ...
- Android 中替代 sharedpreferences 工具类的实现
Android 中替代 sharedpreferences 工具类的实现 背景 想必大家一定用过 sharedpreferences 吧!就我个人而言,特别讨厌每次 put 完数据还要 commit. ...
- 1.0_搭建PHP服务器环境的步骤
a,下载安装一款静态web服务器,ex:HTTPD,IIS; b,下载安装PHP引擎: c,在静态服务器配置一下,声明PHP引擎的存在. 注意,以上三步可以用xampp套件来完成. 启动Apache, ...
- jpa单向一对一关系外键映射
项目结构: Wife package auth.model; import javax.persistence.Column; import javax.persistence.Entity; imp ...
- 170220、maven国内镜像 阿里云
maven确实是一个好东西,但是在国内下载官方仓库的jar却是个大问题,速度不敢恭维,现在oschina的国内maven镜像服务已关闭,无奈之下只能另寻门路. 今天突然发现了阿里云maven国内镜像, ...
- java上传图片,把图片存到本地
思路:js通过FileReader获取图片的Base64,Java解码用IO存到本地. HTML 代码 <input type="file" ng-model="f ...
- 【Linux】命令学习笔记和总结
莫名的想学习一下Linux了,因为对这方面的知识储备为0.对于命令行界面始终是零接触零了解,对一个程序员来说这几乎是致命的,所以简单了解一下. 一.教程参考 参考菜鸟教程即可: Linux 教程 | ...