---恢复内容开始---

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962

Trucking

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11428    Accepted Submission(s): 1104

Problem Description
A certain local trucking company would like to transport some goods on a cargo truck from one place to another. It is desirable to transport as much goods as possible each trip. Unfortunately, one cannot always use the roads in the shortest route: some roads may have obstacles (e.g. bridge overpass, tunnels) which limit heights of the goods transported. Therefore, the company would like to transport as much as possible each trip, and then choose the shortest route that can be used to transport that amount.

For the given cargo truck, maximizing the height of the goods transported is equivalent to maximizing the amount of goods transported. For safety reasons, there is a certain height limit for the cargo truck which cannot be exceeded.

 
Input
The input consists of a number of cases. Each case starts with two integers, separated by a space, on a line. These two integers are the number of cities (C) and the number of roads (R). There are at most 1000 cities, numbered from 1. This is followed by R lines each containing the city numbers of the cities connected by that road, the maximum height allowed on that road, and the length of that road. The maximum height for each road is a positive integer, except that a height of -1 indicates that there is no height limit on that road. The length of each road is a positive integer at most 1000. Every road can be travelled in both directions, and there is at most one road connecting each distinct pair of cities. Finally, the last line of each case consists of the start and end city numbers, as well as the height limit (a positive integer) of the cargo truck. The input terminates when C = R = 0.
 
Output
For each case, print the case number followed by the maximum height of the cargo truck allowed and the length of the shortest route. Use the format as shown in the sample output. If it is not possible to reach the end city from the start city, print "cannot reach destination" after the case number. Print a blank line between the output of the cases.
 
Sample Input
5 6
1 2 7 5
1 3 4 2
2 4 -1 10
2 5 2 4
3 4 10 1
4 5 8 5
1 5 10
5 6
1 2 7 5
1 3 4 2
2 4 -1 10
2 5 2 4
3 4 10 1
4 5 8 5
1 5 4
3 1
1 2 -1 100
1 3 10
0 0
 
Sample Output
Case 1:
maximum height = 7
length of shortest route = 20

Case 2:
maximum height = 4
length of shortest route = 8

Case 3:
cannot reach destination

 
Source
 
Recommend
gaojie   |   We have carefully selected several similar problems for you:  2722 1690 1598 1217 1142 
 
题目大意:输入C,R,代表城市个数,道路个数,下面的R行,每行4个数,a,b,c,e,分别代表 a和b之间有路,height值是c,length值是e,当c=-1时代表没有限制
最后一行三个数代表起点、终点、height的限制,输出最大的height,如果有一样的,输出最小的总length

思路:这题既要控制最短路,也要控制height值的最大,总思路就是二分+最短路。

二分控制最大的height,最短路控制最小的路径。  值得一提的是这题格式很严格,写不对就是wa...不会PE,  还有时限卡的很紧,能优化的最好都优化了

具体看代码

#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e3+;
const int maxk=5e3+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
int d[maxn];//用来存储起点到该点的最短距离,初始化为足够大
int height[maxn][maxn],le[maxn][maxn];//两点间的height,length
int C,R,S,E,limit,max_he,min_le,he;//
bool vis[maxn];//是否访问过,初始化false
void init()
{
//memset(height,-1,sizeof(height));
for(int i=;i<=C;i++)
{
for(int j=;j<=i;j++)
{
le[i][j]=le[j][i]=mod;
height[i][j]=-;
}
}
}
bool solve(int mid)
{
memset(vis,false,sizeof(vis));
for(int i=;i<=C;i++)
{
if(height[S][i]>=mid) d[i]=le[S][i];
else d[i]=mod;
//d[i]=mod;
//vis[i]=false;
}
//d[S]=0;
//he=mod;
while(true)
{
int flag=-;
for(int i=;i<=C;i++)
{
if(!vis[i]&&d[i]!=mod&&(flag==-||d[i]<d[flag]))//没有访问过并且距离不等于mod,因为等于mod代表当前不能走
flag=i;
}
if(flag==-) break;
if(flag==E) return d[flag]!=mod;//这里也是一步优化,只要走到了结束点就行了
vis[flag]=true;
for(int i=;i<=C;i++)
{
//if(le[i][flag]>mid) continue;
if(height[i][flag]<mid) continue;
d[i]=min(d[i],d[flag]+le[flag][i]);
//he=min(he,height[i][flag]);
//d[i]=min(d[i],d[flag]+le[flag][i]);
}
}
return d[E]!=mod;
}
int main()
{
int ca=;
//while(cin>>C>>R)
while(scanf("%d%d",&C,&R)!=EOF)
{ if(C==&&R==) break;
if(ca!=) printf("\n");//这个好像一定要放在break的后面,反正我放在前面wa了
init();
int a,b,c,e;
for(int i=;i<R;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&e);
//cin>>a>>b>>c>>e;
if(c==-) c=mod;//c=-1的话,初始化为无穷大
height[a][b]=c;
height[b][a]=c;
le[a][b]=e;
le[b][a]=e;
}
//cin>>S>>E>>limit;
scanf("%d%d%d",&S,&E,&limit);
int l=,r=limit;
min_le=,max_he=;
while(l<=r)//从0~imit开始二分
{
int mid=(l+r)/;
if(solve(mid))//mid值可以满足,寻求更大的
{
max_he=mid;
min_le=d[E];
l=mid+;
}
else//不能满足,寻求小的
r=mid-;
}
printf("Case %d:\n",ca++);
if(min_le+max_he==) printf("cannot reach destination\n");
else
{
printf("maximum height = %d\n",max_he);
printf("length of shortest route = %d\n",min_le);
} }
return ;
}

UVALive - 4223(hdu 2926)的更多相关文章

  1. UVALive 4223 / HDU 2962 spfa + 二分

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

  2. UVALive 4223 Trucking 二分+spfa

    Trucking 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8& ...

  3. UVALive - 4223,hdu2962(简单dijkstra)

    Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. 二分+最短路 UVALive - 4223

    题目链接:https://vjudge.net/contest/244167#problem/E 这题做了好久都还是超时,看了博客才发现可以用二分+最短路(dijkstra和spfa都可以),也可以用 ...

  5. bzoj千题计划210:bzoj2642 | Poj3968 | UVALive 4992| hdu 3761 Jungle Outpost

    http://www.lydsy.com/JudgeOnline/problem.php?id=2642 题意: n个瞭望台,形成一个凸n边形.这些瞭望台的保护范围是这个凸包内的任意点. 敌人进攻时, ...

  6. UVALive 4225 / HDU 2964 Prime Bases 贪心

    Prime Bases Problem Description Given any integer base b >= 2, it is well known that every positi ...

  7. UVALive 4222 /HDU 2961 Dance 大模拟

    Dance Problem Description For a dance to be proper in the Altered Culture of Machinema, it must abid ...

  8. UVALive 4192/HDU 2959 Close Enough Computations 数学

    Close Enough Computations Problem Description The nutritional food label has become ubiquitous. A sa ...

  9. 【ACM】那些年,我们挖(WA)过的最短路

    不定时更新博客,该博客仅仅是一篇关于最短路的题集,题目顺序随机. 算法思想什么的,我就随便说(复)说(制)咯: Dijkstra算法:以起始点为中心向外层层扩展,直到扩展到终点为止.有贪心的意思. 大 ...

随机推荐

  1. 洛谷P4721 【模板】分治 FFT(生成函数+多项式求逆)

    传送门 我是用多项式求逆做的因为分治FFT看不懂…… upd:分治FFT的看这里 话说这个万恶的生成函数到底是什么东西…… 我们令$F(x)=\sum_{i=0}^\infty f_ix^i,G(x) ...

  2. redhat 安装lamp

    安装Apache yum install httpd 安装MySql yum install mysql mysql-server 安装php yum install php 安装php的mysql模 ...

  3. 【转】 Pro Android学习笔记(五十):ActionBar(3):搜索条

    目录(?)[-] ActionBar中的搜索条 通过Menu item上定义search view 进行Searchable的配置 在activity中将search view关联searchable ...

  4. ES6学习之Promise

    详见之前文章:Promise详解

  5. Android Studio配置使用git

    一.准备 如果没有安装git,那么先要到到Git官网下载git,然后按照提示一步一步安装即可,这个没有什么难度,不过要记得安装的目录. 二.Android Studio配置git File->S ...

  6. HTTP ERROR

    HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HTTP 401.4 ...

  7. java多线程无锁和工具类

    1 无锁 (1) cas (compare and swap) 设置值的时候,会比较当前值和当时拿到的值是否相同,如果相同则设值,不同则拿新值重复过程:注意,在设置值的时候,取值+比较+设值 是一条c ...

  8. MQTT,XMPP,STOMP,AMQP,WAMP适用范围优缺点比较

    想要向服务器发送请求并获得响应?直接使用 HTTP 吧!非常简单.但是当需要通过持久的双向连接来通信时,如 WebSockets,当然你也有其它的选择. 这篇文章会简单扼要的解释 MQTT,XMPP, ...

  9. 微信小程序报错.wxss无法找到

    小程序原来一直运行正常,编译都没有问题,但今天更新了一下工具,就一直编译不过,报.wxss无法找到,搜索半天,才解决. 解决方案如下: 在控制台输入openVendor(), 在打开的目录中清除wcs ...

  10. Servlet的一些细节

    由于客户端是通过URL地址访问web服务器的中的资源的,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet& ...