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

题目链接: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. 升级MySQL 5.7版本遇到的一些小问题(转)

    在5.6版本服务器做备份 /usr/local/mysql/bin/mysqldump -S /tmp/mysql3306.sock -A -p --set-gtid-purged=OFF > ...

  2. (转)python set 用法

    转载自:http://hi.baidu.com/����_xu/blog/item/5b9650c513bd3f049d163d8b .html python的set和其他语言类似, 是一个 基本功能 ...

  3. n文件的上传和下载,struts2和springmvc

    首先,struts2的上传下载的配置 因为struts2是配置的上传的拦截器,很简单的步揍就可以上传, 首先是配置struts的action映射 <!-- 4. 修改上传文件的最大大小为30M ...

  4. shock编程

    Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket ...

  5. Devexpress GridControl

    1.隐藏“Drag a column header here to group by that column”如下: 选择gridview->属性 选择OptionView->ShowGr ...

  6. MySQL的limit优化

    mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降 1.子查询优化法 先找出第一条数据,然后大 ...

  7. linux切割文件【split命令详解】

    linux查看帮助 [tomcat-nohup]$ split --help 用法:split [选项]... [输入 [前缀]] 将输入内容拆分为固定大小的分片并输出到"前缀aa" ...

  8. R-安装、卸载、查看及卸除加载包

    1. 安装包 install.packages("BiocInstaller") 2. 卸载已安装包 remove.packages("BiocInstaller&quo ...

  9. 20169201 实验三 敏捷开发与XP实践报告

    敏捷开发与XP介绍 敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法."敏捷流程"是一系列价值观和方法论的集合.从2001年开始,一些软件界 ...

  10. Java数学相关工具类

    1.求百分比 public class Test1 { public static String myPercent(int y, int z) { String baifenbi = "& ...