二分+最短路 UVALive - 4223
题目链接:https://vjudge.net/contest/244167#problem/E
这题做了好久都还是超时,看了博客才发现可以用二分+最短路(dijkstra和spfa都可以),也可以用dijikstra先算一遍可以求的最大高度,再用dijkstra算一遍这个高度下的最短路,这个应该快一点。
题意:第一行输入n,m表示n个点,m条边,接下来m行,每行有四个数字u,v,h,w,其中u,v表示这条边连接的两个城市,h表示在这条边上货车可以通过的最大高度,w表示距离,最后一行输入三个数字start,end,limit分别表示起点,终点,卡车可以载的最大高度。现在叫我们求出卡车从起点到终点可以载的最大高度下的最短路。就是先保证高度最大,再保证距离最短。
思路:用二分来假设假设高度,再用最短路判断从起点能否到终点,同时求出最短路。
之所以写这篇博客是要告诉大家,在这里有格式要求,经过我一个小时的摸索发现如果在格式错误的情况下在UVA提交会显示WA而不是PE
如果大家是答案错误又找不出问题,可以看看格式是否正确。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<cstdio>
using namespace std;
#define eps 1e-8
#define ll long long
#define INF 0x3fffffff
struct node{
int v,next,w,h;
}edge[];
int head[],dis[],vis[];
queue<int>q;
int start,end1,limit,min1,max1;
int n,m,k,t,cnt;
void init()
{
memset(head,-,sizeof(head));
cnt=;
}
void add(int u,int v,int w,int h)
{
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].h=h;
edge[cnt].next=head[u];
head[u]=cnt;
}
void BFS(int start,int end1,int mid)
{
while(!q.empty())
q.pop();
for(int i=;i<=n;i++)
dis[i]=INF;
memset(vis,,sizeof(vis));
q.push(start);
vis[start]=;
dis[start]=;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
int w=edge[i].w;
int h=edge[i].h;
if(h>=mid&&dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(!vis[v])
{
vis[v]=;
q.push(v);
}
}
}
}
}
void two_(int l,int r,int start,int end1)
{
int mid;
max1=-,min1=-;
while(l<=r)
{
mid=(l+r)/;
BFS(start,end1,mid);
if(dis[end1]!=INF) //可以到达
{
l=mid+;
max1=mid; //更新
min1=dis[end1];
}
else
{
r=mid-;
}
}
}
int main()
{
int count1=;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(!n||!m)
break;
init();
int u,v,w,h;
for(int i=;i<m;i++)
{
scanf("%d%d%d%d",&u,&v,&h,&w);
if(h==-)
h=INF;
add(u,v,w,h);
add(v,u,w,h);
}
scanf("%d%d%d",&start,&end1,&limit);
two_(,limit,start,end1); //二分找答案
if(count1>)
printf("\n");
printf("Case %d:\n",++count1);
if(min1==-||max1==-)
printf("cannot reach destination\n");
else
{
printf("maximum height = %d\n",max1);
printf("length of shortest route = %d\n",min1);
}
}
return ;
}
二分+最短路 UVALive - 4223的更多相关文章
- 二分+最短路 uvalive 3270 Simplified GSM Network(推荐)
// 二分+最短路 uvalive 3270 Simplified GSM Network(推荐) // 题意:已知B(1≤B≤50)个信号站和C(1≤C≤50)座城市的坐标,坐标的绝对值不大于100 ...
- BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1614 分析 类似POJ_3662_Telephone_Lines_(二分+最短路) Dijks ...
- P1462 通往奥格瑞玛的道路 (二分+最短路)
题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...
- 2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)
传送门 这题直接做显然gg" role="presentation" style="position: relative;">gggg,看这数据 ...
- UVALive - 4223(hdu 2926)
---恢复内容开始--- 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS ...
- 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举
2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举 ...
- Luogu P1951 收费站_NOI导刊2009提高(2) 二分 最短路
思路:二分+最短路 提交:1次 题解: 二分最后的答案. $ck()$: 对于每次的答案$md$跑$s,t$的最短路,但是不让$c[u]>md$的点去松弛别的边,即保证最短路不经过这个点.最后$ ...
- BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线 (二分+最短路)
题意: 给一个2e4带正边权的图,可以免费k个边,一条路径的花费为路径上边权最大值,问你1到n的最小花费 思路: 对于一个x,我们如果将大于等于x的边权全部免费,那么至少需要免费的边的数量就是 “设大 ...
- UVALive 4223 / HDU 2962 spfa + 二分
Trucking Problem Description A certain local trucking company would like to transport some goods on ...
随机推荐
- div的全屏与退出全屏
div的全屏与退出全屏 作用:将div全屏与退出全屏,一般播放器使用较多. html按钮: <button onclick="showFull();"> 全屏 < ...
- HBase 入门
使用条件: 海量数据百亿级的行 百万列, 准实时查询 使用场景: 比如金融,交通,电商,移动等 特点: 1:
- APP-12-视觉技术-身份证识别
1.Postman测试 图片转换为Base64:http://imgbase64.duoshitong.com/ Base64: Base64数据去掉表头文件:data:image/png;base6 ...
- spark使用scala读取Avro数据(转)
这是一篇翻译,原文来自:How to load some Avro data into Spark. 首先,为什么使用 Avro ? 最基本的格式是 CSV ,其廉价并且不需要顶一个一个 schema ...
- Haskell语言学习笔记(89)Unicode UTF8
unicode-show $ cabal install unicode-show Installed unicode-show-0.1.0.2 Prelude> :m +Text.Show.U ...
- 16进制转ascii,转字符串
/** * 16进制转化为字母 * @param hex 要转化的16进制数,用逗号隔开 * 如:53,68,61,64,6f,77 * @return */ public static String ...
- delphi 原创应用工具箱
用到的主要知识点: (1) listview背景透明 (2) 读取应用图标 (3)图标透明 (4)实时显示微软必应首页图,裁剪图片等
- unity 三种注入示例
/* * 演示Unity 注入 * */ using Microsoft.Practices.Unity; using System; namespace Unity.Property.Inject ...
- C# 依赖注入那些事儿
原文地址:http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 里面有一个例子差了些代码,补全后贴上. 3.1.3 依赖获取 u ...
- yum源制作
CentOS7 同步远程镜像 搭建本地yum服务器同步CentOS镜像站点的数据到本地服务器,使用nginx实现http服务向局域网内的其他机器提供yum服务,解决内网yum安装软件的问题. 一.前提 ...