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\)的函数图像),所以可以三分. 下面是我的三分代码(骗了不少 ...
随机推荐
- Raspberry Pi(树莓派)上从零开始构建Linux系统(简称PiLFS)(一)
一. 准备工作 1. 装有Linux宿主系统的树莓派主板,可参考 Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器) 2. 参考网址:Linux From Scratch ...
- 【repost】js字符串函数
JS自带函数concat将两个或多个字符的文本组合起来,返回一个新的字符串.var a = "hello";var b = ",world";var c = a ...
- 毕向东_Java基础视频教程第19天_IO流(11~14)
第19天-11-IO流(字节流File读写操作) import java.io.FileInputStream; import java.io.FileOutputStream; import jav ...
- Google Daydream 在中国的第一次演讲摘录
从 PC.手机到 VR/AR,计算机平台正在迁移,而在这个过程中,与用户使用体验息息相关的「人机交互方式」也将不可避免的发生变化.作为这几波浪潮的弄潮儿,Google 怎么看这种人机交互方式的演进? ...
- sublime & atom 插件
1. autofilename(sublime) autocomplete-paths (atom): 自动路径 2. autoprefixer: 自动添加前缀 : https://github.c ...
- CFround#380 div2
题目链接:http://codeforces.com/contest/738 A题:SB题. B题:SB题. C题:二分. D题:贪心. E题:乱搞. F题:设f[i][j][k]代表甲先手,左边消去 ...
- 遍历Map集合的四中方法
->有这样一个Map集合 Map<String, String> map = new HashMap<String, String>(); map.put(", ...
- linux xfce4普通用户 mount usb提示: Not authorized to perform operation
问题:xfce4下,USB 硬盘能自动挂载并显示,但是普通用户操作时,提示:Not authorized to perform operation. 时间:20160928 os:gentoo + x ...
- get_class_vars 返回由类的默认属性组成的数组
get_class_vars (PHP 4, PHP 5) get_class_vars - 返回由类的默认属性组成的数组 说明 array get_class_vars ( string $clas ...
- webp图片详解
WebP(发音 weppy),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使 ...