题目链接: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的更多相关文章

  1. 二分+最短路 uvalive 3270 Simplified GSM Network(推荐)

    // 二分+最短路 uvalive 3270 Simplified GSM Network(推荐) // 题意:已知B(1≤B≤50)个信号站和C(1≤C≤50)座城市的坐标,坐标的绝对值不大于100 ...

  2. BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1614 分析 类似POJ_3662_Telephone_Lines_(二分+最短路) Dijks ...

  3. P1462 通往奥格瑞玛的道路 (二分+最短路)

    题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...

  4. 2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)

    传送门 这题直接做显然gg" role="presentation" style="position: relative;">gggg,看这数据 ...

  5. UVALive - 4223(hdu 2926)

    ---恢复内容开始--- 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS ...

  6. 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 -二分+最短路+枚举 ...

  7. Luogu P1951 收费站_NOI导刊2009提高(2) 二分 最短路

    思路:二分+最短路 提交:1次 题解: 二分最后的答案. $ck()$: 对于每次的答案$md$跑$s,t$的最短路,但是不让$c[u]>md$的点去松弛别的边,即保证最短路不经过这个点.最后$ ...

  8. BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线 (二分+最短路)

    题意: 给一个2e4带正边权的图,可以免费k个边,一条路径的花费为路径上边权最大值,问你1到n的最小花费 思路: 对于一个x,我们如果将大于等于x的边权全部免费,那么至少需要免费的边的数量就是 “设大 ...

  9. UVALive 4223 / HDU 2962 spfa + 二分

    Trucking Problem Description A certain local trucking company would like to transport some goods on ...

随机推荐

  1. Jmeter性能测试基础

    压力测试   压力测试分两种场景:一种是单场景,压一个接口的:第二种是混合场景,多个有关联的接口.压测时间,一般场景都运行10-15分钟.如果是疲劳测试,可以压一天或一周,根据实际情况来定. 压测任务 ...

  2. TabNavigator Container Example

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  3. 如何创建一个django工程与和mysql打通

    1. 安装Django # 在指定解释器环境下安装django 1.11.x # 在真实python3环境下: pip3 install django==1.11.x # 查看django版本: dj ...

  4. Python 百分号字符串拼接

    # %s可以接收一切 %d只能接收数字 msg = 'i am %s my hobby is %s' %('lhf','alex') print msg msg2 = 'i am %s my hobb ...

  5. python 停止线程

    Python没有提供方法去结束一个线程,无法给它发送信号,无法调整它的调度,也无法执行其他高级操作. 如果需要终止线程,需要通过编程让这个线程在某个特定点轮询来退出.但是如果一个线程一直阻塞在一个 I ...

  6. css3 制作一个遮罩

    思路:1.显示两块图片,2.图片区域(初始隐藏),3.鼠标移入,遮罩显示,此时遮住图片,4.鼠标移出,遮罩恢复初始状态 用到两个css3 属性:transtion ,transform 用法: 1. ...

  7. Linux命令:chmod

    https://baijiahao.baidu.com/s?id=1616750933810368135&wfr=spider&for=pc

  8. 【转】【java】论integer是地址传递还是值传递

    转自:http://www.tuicool.com/articles/AraaQbZ 论integer是地址传递还是值传递 Integer 作为传参的时候是地址传递 , 可以参考如下例子,在程序刚启动 ...

  9. (Java)怎么去掉字符串数组中重复的值?

    String fdbs = "WXB,WXA,FDA,WXB"; String[] str = fdbs.split(","); Set set = new H ...

  10. Idiom: a Lot on my Plate

    Idiom: a Lot on my Plate Share Tweet Share Tagged With: Idioms I’ve got a lot on my plate.  American ...