UVALive - 4223(hdu 2926)-程序员宅基地

技术标签: java  php  

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

题目链接: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+7;
const int maxn=1e3+10;
const int maxk=5e3+10;
const int maxx=1e4+10;
const ll maxe=1000+10;
#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=1;i<=C;i++)
    {
        for(int j=1;j<=i;j++)
            {
                le[i][j]=le[j][i]=mod;
                height[i][j]=-1;
            }
    }
}
bool  solve(int mid)
{
    memset(vis,false,sizeof(vis));
    for(int i=1;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=-1;
        for(int i=1;i<=C;i++)
        {
            if(!vis[i]&&d[i]!=mod&&(flag==-1||d[i]<d[flag]))//没有访问过并且距离不等于mod,因为等于mod代表当前不能走
                flag=i;
        }
        if(flag==-1) break;
        if(flag==E) return d[flag]!=mod;//这里也是一步优化,只要走到了结束点就行了
        vis[flag]=true;
        for(int i=1;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=1;
    //while(cin>>C>>R)
    while(scanf("%d%d",&C,&R)!=EOF)
    {

        if(C==0&&R==0) break;
        if(ca!=1) printf("\n");//这个好像一定要放在break的后面,反正我放在前面wa了
        init();
        int a,b,c,e;
        for(int i=0;i<R;i++)
        {
            scanf("%d%d%d%d",&a,&b,&c,&e);
            //cin>>a>>b>>c>>e;
            if(c==-1) 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=0,r=limit;
        min_le=0,max_he=0;
        while(l<=r)//从0~imit开始二分
        {
            int mid=(l+r)/2;
            if(solve(mid))//mid值可以满足,寻求更大的
            {
                max_he=mid;
                min_le=d[E];
                l=mid+1;
            }
            else//不能满足,寻求小的
                r=mid-1;
        }
        printf("Case %d:\n",ca++);
        if(min_le+max_he==0) printf("cannot reach destination\n");
        else
        {
            printf("maximum height = %d\n",max_he);
            printf("length of shortest route = %d\n",min_le);
        }

    }
    return 0;
}

 

转载于:https://www.cnblogs.com/caijiaming/p/9442330.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aijiongzhi0439/article/details/101461226

智能推荐

响应式菜单_meanmenu.js-程序员宅基地

文章浏览阅读1.5k次。因公司近期需用到响应式菜单栏,临时做了一个,PC端左侧菜单栏通过css实现,其中移动端有用到jquery.meanmenu.js插件。可能没那么完美,但是基本也勉强够用了,有些功能或者样式可以自己调整。仅供大家和自己参考,有问题请指出。感谢!_meanmenu.js

fabric系列一:适用于ubuntu18的Hyperledger-fabric2020年最新版2.3.0环境搭建_fabric v2.3.0 搭建-程序员宅基地

文章浏览阅读2.4k次,点赞9次,收藏34次。Hyperledger-fabric2.3.0环境搭建1. 安装docker1.1 首先,更新需求项1.2 添加更新源1.3 添加docker下载镜像1.4 加入密钥与相关设置1.5 安装docker最后的准备(可有可无吧,这一步不需要成功,应该是只需要其中的一些启动项)实施安装查看版本1.6 加入用户将用户加入该group内,然后退出并重新登陆重启docker服务当前用户切换到docker数组2. 安装docker-compose2.1 安装依赖工具2.1 补充[升级python为3]2.2 准备2.3 _fabric v2.3.0 搭建

SAP ABAP BDC 的使用及代码详解-程序员宅基地

文章浏览阅读1.6w次,点赞20次,收藏99次。首先介绍一下BDC即Batch Data Conversion。由于某种原因,当我们需要大量并且重复的输入保存变更删除数据的操作,且没有对应的BAPI可以使用的时候,可以使用BDC的方式进行。其原理是sap通过录屏的方式将业务操作记录下来,然后让计算机重复的进行操作。一,录制业务操作输入TCode:SHDB进入BDC录制初始界面单击工具栏 Newrecording 按钮创建一个新的BDC,系统将弹出Create Recording对话框,要求输入记录名称(此名称可以不用Y或Z开头来定义)和录制程_abap bdc

Linux环境下安装JDK11_java 11 linux 百度网盘下载-程序员宅基地

文章浏览阅读1.5k次。Linux环境下安装JDK11安装包下载链接:https://pan.baidu.com/s/1PpORKQ5dcynRl9L0jvInjw提取码:rxdj安装步骤将下载的文件放入Linux的文件中并使用如下命令进行解压tar -xvf jdk-11.0.12_linux-x64_bin.tar.gz修改环境变量, vim /etc/profile 添加如下内容(目录为自己解压的路径)# JAVA_HOME# /home/software/jdk11为自己解压的路径e_java 11 linux 百度网盘下载

Linux中执行sh文件时提示:nohup: 无法运行命令“./startup.sh“: 权限不够_nohup ./startup.sh &-程序员宅基地

文章浏览阅读6.7k次,点赞2次,收藏6次。场景Linux服务器,在运行启动的.sh文件时nohup ./startup.sh &提示nohup: 无法运行命令"./startup.sh": 权限不够注:博客:https://blog.csdn.net/badao_liumang_qizhi关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现这是因为权限不够,首先进入bin目录下,在bin目录下执行chmod u+x *.sh然后再运行就可以了..._nohup ./startup.sh &

C语言的输入与输出_c语言实现hdmi输入输出-程序员宅基地

文章浏览阅读332次。今天感觉过的有点迷,早上是电脑系统更新了一早上,下午是刚到了HDMI转VGA的数据线,一直想着尝试,感觉今儿的学习状态极差反正。今晚好好整理一波了,总归是要收获知识的。1.关于putchar: 函数:int putchar ( int c ) 功能是向终端输出一个字符,而这个参数呢,可以是变量,字符常量,整数常量或者是表达式,像putchar(65+32)之类的,感觉需要注_c语言实现hdmi输入输出

随便推点

按百分制输入学生成绩,然后将成绩划分为4个等级:85分以上为优秀,70~84分为良好,60~69分为及格,60分以下为不及格,要求从键盘输入成绩后输出相应等级。_编写一个swift程序,根据学生成绩判断其成绩等级85分以上为a 84~70分为b 69~60分为-程序员宅基地

文章浏览阅读7.1k次,点赞2次,收藏8次。按百分制输入学生成绩,然后将成绩划分为4个等级:85分以上为优秀,70-84分为良好,60-69分为及格,60分以下为不及格,要求从键盘输入成绩后输出相应等级。score = float(input("请输入学生成绩:"))if score < 60: grade = "不及格"elif score < 70: grade = "及格"elif score < 85: grade = "良好"else: grade = "优秀"print("百制_编写一个swift程序,根据学生成绩判断其成绩等级85分以上为a 84~70分为b 69~60分为

[团队] 在Unity项目中使用FMOD来管理你的音效_unity fmod-程序员宅基地

文章浏览阅读6.3k次。Unity 项目 FMOD 音效管理入门教程_unity fmod

sharding-jdbc实现按年分库按月分表_sharding以年分库 以月分表-程序员宅基地

文章浏览阅读6.4k次。原文地址 sharding-jdbc官方文档:https://shardingsphere.apache.org/document/current/cn/overview/ 本文采用当当的shardingjdbc实现按年分库,按月分表 最终数据库结果如下 image.png 例如有如下sql语句 s..._sharding以年分库 以月分表

vue3焦点获取、动态定位焦点,vue3光标定位,vue3 input focus_vue3setup怎么使用focus-程序员宅基地

文章浏览阅读4.8k次。vue3焦点获取、动态定位焦点,v <div> //获取焦点主要就是定义一个ref <input v-model="inputvalue" ref="inputVal"/> <button @click="addItem">提交</button> </div> methods:{ //事..._vue3setup怎么使用focus

angular ng-model 中接收后台的时间戳格式化_angular ngmodel 时间格式化-程序员宅基地

文章浏览阅读6.9k次。1,将input 上的后天传回的时间戳格式化年月日,首先在网上百度各种,有的说不用ng-model ,直接用value,在valeu中将入过滤器,应为ng-model是不能直接加过滤器的展示代码如下: value="{{g.accepTime |date:'yyyy-MM-dd'}} "style="cursor: pointer;">时间是格式化了,但是不能双向绑定了,向后台传入时间,故_angular ngmodel 时间格式化

Android自定义控件androidx.constraintlayout.widget.ConstraintLayout-程序员宅基地

文章浏览阅读3.5k次。<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/tvMsg" android:layout_width="match_parent" android:layout_h..._androidx.constraintlayout.widget.constraintlayout

推荐文章

热门文章

相关标签