POJ 3662 Telephone Lines【二分答案+最短路】||【双端队列BFS】
<题目链接>
题目大意:
在一个节点标号为1~n的无向图中,求出一条1~n的路径,使得路径上的第K+1条边的边权最小。
解题分析:
直接考虑情况比较多,所以我们采用二分答案,先二分枚举第K+1条路的边权,然后根据枚举的边权,重新建图。因为john只需要支付除K条边之后权值最大的边,所以对于所有边权小于等于枚举边的,将其边权置为0,对于那些大于枚举边权的边,边权则置为1,这样,对1~n跑最短路,就能够用于判断枚举的答案是否成立。因为建的是边权为0、1的图求最短路,所以也可以用双端队列实现的BFS求解。
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #include <algorithm>
- using namespace std;
- #define clr(a,b) memset(a,b,sizeof(a))
- #define rep(i,s,t) for(int i=s;i<=t;i++)
- #define pb push_back
- const int N = 1e3+, M = 1e4+;
- const int INF = 0x3f3f3f3f;
- int n,m,k,cnt,head[N],vis[N];
- struct Edge{
- int to,nxt,val;
- }edge[M<<];
- struct Ege{ //记录下初始输入边的个数
- int x,y,w;
- Ege(int _x=,int _y=,int _w=):x(_x),y(_y),w(_w){}
- };
- vector<Ege>vec;
- struct Node{
- int dist,loc;
- Node(int _dist=,int _loc=):dist(_dist),loc(_loc){}
- bool operator <(const Node &tmp)const{ return dist>tmp.dist; }
- }node[N];
- void init(){
- cnt=;clr(head,-);
- }
- void addedge(int u,int v,int w){
- edge[++cnt].to=v,edge[cnt].val=w;
- edge[cnt].nxt=head[u],head[u]=cnt;
- }
- void Getmap(int x){
- init();
- for(int i=;i<vec.size();i++){
- Ege now=vec[i];
- int u=now.x,v=now.y,w=now.w;
- if(w<=x)addedge(u,v,),addedge(v,u,); //将花费<=k的道路边权置0,因为john只需要支付最大的道路
- else addedge(u,v,),addedge(v,u,); //大于的边置为1,免费的k条边是否能够在满足题目条件的情况下,连通1~n点
- }
- }
- bool check(int x){
- Getmap(x); //根据枚举的答案,建立0、1图,然后在这个0、1图上跑最短路
- priority_queue<Node>q;
- for(int i=;i<=n;i++){
- vis[i]=,node[i].loc=i,node[i].dist=INF;
- }
- node[].dist=;
- q.push(node[]);
- while(q.size()){
- int u=q.top().loc;q.pop();
- if(vis[u])continue;
- vis[u]=;
- for(int i=head[u];~i;i=edge[i].nxt){
- int v=edge[i].to;
- if(node[v].dist>node[u].dist+edge[i].val){
- node[v].dist=node[u].dist+edge[i].val;
- q.push(node[v]);
- }
- }
- }
- if(node[n].dist<=k)return true;
- return false;
- }
- int main(){
- while(scanf("%d%d%d",&n,&m,&k)!=EOF){
- rep(i,,m){
- int u,v,w;scanf("%d%d%d",&u,&v,&w);
- vec.pb(Ege(u,v,w));
- }
- int l=,r=1e6+,ans=-;
- while(l<=r){ //二分答案,枚举john需要支付的钱数,即连通1~n的道路中,除k条路外,花费最大的路径
- int mid=l+r>>;
- if(check(mid))ans=mid,r=mid-;
- else l=mid+;
- }
- printf("%d\n",ans);
- }
- }
2019-03-06
POJ 3662 Telephone Lines【二分答案+最短路】||【双端队列BFS】的更多相关文章
- POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7214 Accepted: 2638 D ...
- POJ 3662 Telephone Lines(二分+最短路)
查看题目 最小化第K大值. 让我怀疑人生的一题目,我有这么笨? #include <cstdio> #include <queue> #include <cstring& ...
- poj-3662 Telephone Lines 二分答案+最短路
链接:洛谷 POJ 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone co ...
- POJ 3662 Telephone Lines (二分+Dijkstra: 最小化第k大的值)
题意 Farmer John想从电话公司修一些电缆连接到他农场.已知N个电线杆编号为1,2,⋯N,其中1号已经连接电话公司,N号为农场,有P对电线杆可连接. 现给出P对电线杆距离Ai,Bi,Li表示A ...
- POJ 3662 Telephone Lines (二分+dijkstra)
题意: 多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人. 该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话 ...
- (poj 3662) Telephone Lines 最短路+二分
题目链接:http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total ...
- POJ 3662 Telephone Lines(二分答案+SPFA)
[题目链接] http://poj.org/problem?id=3662 [题目大意] 给出点,给出两点之间连线的长度,有k次免费连线, 要求从起点连到终点,所用的费用为免费连线外的最长的长度. 求 ...
- poj 3662 Telephone Lines(最短路+二分)
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6973 Accepted: 2554 D ...
- POJ - 3662 Telephone Lines (Dijkstra+二分)
题意:一张带权无向图中,有K条边可以免费修建.现在要修建一条从点1到点N的路,费用是除掉免费的K条边外,权值最大的那条边的值,求最小花费. 分析:假设存在一个临界值X,小于X的边全部免费,那么此时由大 ...
随机推荐
- Confluence 6 使用 CSS 样式化 Confluence 的介绍
这个页面对 Confluence 通过修改 CSS 来改变外观和感觉的情况进行了说明. 层叠样式表(Cascading Style Sheets (CSS))是对 Web 页面进行样式化的工业化标准. ...
- django rest framework(3)
目录 一.版本 二.解析器 三.序列化 四.请求数据验证 一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. class ...
- vue中引入css文件
两种方式引入css文件,一种是直接在main.js中引入(也可以在其他的.vue文件中的<script></script>标签中),即下面这种写法: import 'eleme ...
- Play框架--初学笔记
目录结构 web_app 根目录 | sbt SBT Unix 批处理脚本用于启动sbt-launch.jar | sbt.bat SBT Windows 批处理脚本用于启动sbt-launch.ja ...
- PAT Basic 1069. 微博转发抽奖(20)
小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整数M(<= 1000).N ...
- NHibernate:no persister for 异常
几种原因: 1.配置文件后缀名写错 mapping file 必须是.hbm.xml结尾 2.Web.config配置里面引用实体 <session-factory> .......... ...
- C#矩阵求逆
来源:http://zhidao.baidu.com/link?url=DiqAbq9YUYn3z7QjxGGoF0PLZwN-Y9ecqKB7Gy38JWRD1riMIYukVKXKq88pxtWL ...
- oracle安装过程中先决条件检查失败的解决办法
1:公司数据库开始用的mysql,因为公司做的是保密性项目,所以就在项目日志过多的时候项目有爆炸的迹象啊(3000千万数据,貌似mysql有点撑不住).然后组长开始让我安装oracle,公司的内网也是 ...
- TagCanvas 插件
TagCanvas是一个基于HTML5 Canvas技术开发的标签云动画.还提供一个以jQuery插件形式实现的版本. 它支持文本和图片两种格式,能够以Sphere, hcylinder 或 vcyl ...
- CentOS下配置SFTP操作日志
1.修改ssh的配置 vi /etc/ssh/sshd_config 在36行左右修改如下配置 Subsystem sftp /usr/libexec/openssh/sftp-server -l I ...