二分+最短路 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 ...
随机推荐
- RestTemplate的异步使用
参考:https://blog.csdn.net/yezhuanxu/article/details/53643248 支持异步调用AsyncRestTemplate @RequestMapping( ...
- Swoole 结合TP5创建http服务
下载TP5框架,在项目根目录下创建server目录 http_service.php <?php //创建服务 $http = new swoole_http_server("0.0. ...
- 网关协议学习:CGI、FastCGI、WSGI
网关协议学习:CGI.FastCGI.WSGI https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
- 使用Prometheus+Grafana监控MySQL实践
一.介绍Prometheus Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采 ...
- idea插件JRebel 解决热编译,开启高级debug之路
idea自身的debug模式遇到 类属性增加什么的只能重启,不能做到更深层次的热部署...至于为啥不能,---这是java自身类加载机制导致的?这个问题可以以后深究(貌似很深奥)....本文的重点是介 ...
- 解决 'Could not convert variant of type (NULL) into type (String)
写存储过程中有不允许为空的字段,在客户端转化取数时显示 Could not convert variant of type (NULL) into type (String) 可以在存储过程中使用is ...
- 使用mysqlbinlog恢复指定表
从整库备份的sql文件中导出某个表的sql语句时,vim查找到表的第一条INSERT语句后,按上下换行键计数INSERT语句的条数,然后按n yy复制,退出vim后,再新建一个文件,按p粘贴刚才的n条 ...
- LeetCode OJ 144. Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...
- 修改Http消息的消息头Host
在 HttpURLConnection 类中直接使用如下代码无法修改Host的值: connection.setRequestProperty("Host", host); 需要在 ...
- MyBatis对入参对象的属性空判断
<!-- 查询学生list,like姓名 --> <select id="getStudentListLikeName" parameterType=&q ...