HDU2363 最短路+贪心
Cycling
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1418 Accepted Submission(s): 467
You are given:
the number of crossings and their altitudes, and
the roads by which these crossings are connected.
Your program must find the route that minimizes the altitude difference between the highest and the lowest point on the route. If there are multiple possibilities, choose the shortest one.
For example:
In this case the shortest path from 1 to 7 would be through 2, 3 and 4, but the altitude difference of that path is 8. So, you prefer to go through 5, 6 and 4 for an altitude difference of 2. (Note that going from 6 directly to 7 directly would have the same difference in altitude, but the path would be longer!)
One line with two integers n (1 <= n <= 100) and m (0 <= m <= 5000): the number of crossings and the number of roads. The crossings are numbered 1..n.
n lines with one integer hi (0 <= hi <= 1 000 000 000): the altitude of the i-th crossing.
m lines with three integers aj , bj (1 <= aj , bj <= n) and cj (1 <= cj <= 1 000 000): this indicates that there is a two-way road between crossings aj and bj of length cj . You may assume that the altitude on a road between two crossings changes linearly.
You start at crossing 1 and the contest is at crossing n. It is guaranteed that it is possible to reach the programming contest from your home.
the minimum altitude difference, and
the length of shortest path with this altitude difference.
3
5
4
- //这题气炸了,用dijk怎么做怎么不对,改了spfa才过的。要求最小差值的最短路可以把所有的点之间的差值
- //算出来,按照差值从小到大排序,从小到大枚举每一个差值所对应的高度上下界,在这个范围之内求
- //最短路,求到的第一个就是结果。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include<queue>
- #include<vector>
- using namespace std;
- const int inf=0x7fffffff;
- int dis[],vis[],hig[];
- int up,low,t,n,m,cnt;
- struct Lu
- {
- int x,y,w;
- }L[];
- bool cmp(Lu x,Lu y) {return x.w<y.w;}
- struct node{
- int to,value;
- };
- vector<node>g[];
- int spfa()
- {
- int s=;
- for(int i=;i<=n;i++)
- dis[i]=inf;
- memset(vis,,sizeof(vis));
- vis[s]=;
- dis[s]=;
- queue<int>q;
- q.push(s);
- while(!q.empty()){
- int cur=q.front();
- q.pop();
- vis[cur]=;
- if(hig[cur]<low||hig[cur]>up) continue; //起始点也不例外
- for(int i=;i<(int)g[cur].size();i++){
- int k=g[cur][i].to;
- if(hig[k]<low||hig[k]>up) continue; //在范围之中
- if(dis[k]>dis[cur]+g[cur][i].value){
- dis[k]=dis[cur]+g[cur][i].value;
- if(!vis[k]){
- vis[k]=;
- q.push(k);
- }
- }
- }
- }
- return dis[n];
- }
- int main()
- {
- int x,y,z,ans1,ans2;
- scanf("%d",&t);
- while(t--){
- scanf("%d%d",&n,&m);
- cnt=;ans2=inf;
- for(int i=;i<=n;i++){
- g[i].clear(); //记住。
- scanf("%d",&hig[i]);
- }
- for(int i=;i<=n;i++){
- for(int j=i;j<=n;j++){ //有可能起点等于终点所以j从i开始
- L[cnt].x=min(hig[i],hig[j]);
- L[cnt].y=max(hig[i],hig[j]);
- L[cnt].w=L[cnt].y-L[cnt].x;
- cnt++;
- }
- }
- for(int i=;i<=m;i++){
- scanf("%d%d%d",&x,&y,&z);
- node no;
- no.to=y;
- no.value=z;
- g[x].push_back(no);
- no.to=x;
- g[y].push_back(no);
- }
- sort(L,L+cnt,cmp);
- int flag=,tmp;
- for(int i=;i<cnt;i++){
- if(flag&&tmp<L[i].w) break;//出现高度差一样,最短路不同的情况
- low=L[i].x;up=L[i].y;
- int ans=spfa();
- if(ans!=inf){
- ans1=L[i].w;
- ans2=min(ans2,ans);
- flag=;
- tmp=L[i].w;
- }
- }
- printf("%d %d\n",ans1,ans2);
- }
- return ;
- }
HDU2363 最短路+贪心的更多相关文章
- Codeforces Round #303 (Div. 2) E. Paths and Trees 最短路+贪心
题目链接: 题目 E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes inputs ...
- Codeforces 1076D Edge Deletion 【最短路+贪心】
<题目链接> 题目大意: n个点,m条边的无向图,现在需要删除一些边,使得剩下的边数不能超过K条.1点为起点,如果1到 i 点的最短距离与删除边之前的最短距离相同,则称 i 为 " ...
- 【CF1076D】Edge Deletion 最短路+贪心
题目大意:给定 N 个点 M 条边的无向简单联通图,留下最多 K 条边,求剩下的点里面从 1 号顶点到其余各点最短路大小等于原先最短路大小的点最多怎么构造. 题解:我们可以在第一次跑 dij 时直接采 ...
- Codeforces 545E. Paths and Trees[最短路+贪心]
[题目大意] 题目将从某点出发的所有最短路方案中,选择边权和最小的最短路方案,称为最短生成树. 题目要求一颗最短生成树,输出总边权和与选取边的编号.[题意分析] 比如下面的数据: 5 5 1 2 2 ...
- Forethought Future Cup - Elimination Round D 贡献 + 推公式 + 最短路 + 贪心
https://codeforces.com/contest/1146/problem/D 题意 有一只青蛙,一开始在0位置上,每次可以向前跳a,或者向后跳b,定义\(f(x)\)为青蛙在不跳出区间[ ...
- Codeforces Round #303 (Div. 2)(CF545) E Paths and Trees(最短路+贪心)
题意 求一个生成树,使得任意点到源点的最短路等于原图中的最短路.再让这个生成树边权和最小. http://codeforces.com/contest/545/problem/E 思路 先Dijkst ...
- [CSP-S模拟测试]:任务分配(最短路+贪心+DP)
题目传送门(内部题149) 输入格式 每个测试点第一行为四个正整数$n,b,s,m$,含义如题目所述. 接下来$m$行,每行三个非负整数$u,v,l$,表示从点$u$到点$v$有一条权值为$l$的有向 ...
- UOJ244 短路 贪心
正解:贪心 解题报告: 传送门! 贪心真的都是些神仙题,,,以我的脑子可能是不存在自己想出解这种事情了QAQ 然后直接港这道题解法趴,,, 首先因为这个是对称的,所以显然的是可以画一条斜右上的对角线, ...
- 【AT2434】JOI 公園 (JOI Park) 最短路+贪心
题解 我的歪解 我首先想的是分治,我想二分肯定不行,因为它是没有单调性的. 我想了一下感觉它的大部分数据应该是有凸性的(例如\(y=x^2\)的函数图像),所以可以三分. 下面是我的三分代码(骗了不少 ...
随机推荐
- 【Java每日一题】20170111
20170110问题解析请点击今日问题下方的"[Java每日一题]20170111"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- nordic DFU固件升级
一:测试固件芯片类型: nordic 52832 二:下载升级源码 1>nRF Toolbox App 源码 https://github.com/NordicSemiconductor/IO ...
- Ubuntu中Qt+opencv图像显示
先抛出一个疑问,知道的希望留言解答下 (创建Application->Qt Console Application,代码与下面2.3一样,运行有时会显示图片,但大多数不显示,为什么?) 1.打开 ...
- 打印java堆栈信息
使用如下命令: kill -3 {pid} 可以打印指定线程的堆栈信息到tomcat的catalina.out日志中.在性能测试过程中,可以观察响应时间的曲线,如果突然出现波峰则抓取当前时间点tomc ...
- 鼠标形状css样式
鼠标形状css样式 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- SQL总结之增删改查
SQL语句增删改查(总结) 一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:ins ...
- 【安装】python3.4版安装与2.x共存问题
首先,到官网去下载python3.x版,这里推荐3.4以上的版本,自带pip库,以后不用自己另外下载 3.4.4版: https://www.python.org/downloads/release/ ...
- Java代理模式汇总
简介 代理模式即Proxy Pattern,23种java常用设计模式之一.其定义为:对其他对象提供一种代理以控制对这个对象的访问. UML类图 静态代理 目标接口 public interface ...
- CodeForces 689E Mike and Geometry Problem
离散化,树状数组,组合数学. 这题的大致思路和$HDU$ $5700$一样.都是求区间交的问题.可以用树状数组维护一下. 这题的话只要计算每一个$i$被统计了几次,假设第$i$点被统计了$ans[i] ...
- HDU 5877 Weak Pair
$dfs$序,线段树. 可以统计每一个节点作为$root$的子树上对答案的贡献,可以将树转换成序列.问题就变成了一段区间上求小于等于某个值的数有几个.用线段树记录排好序之后的区间序列,询问的时候,属于 ...