Cycling

Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 105 Accepted Submission(s): 49
 
Problem Description
You want to cycle to a programming contest. The shortest route to the contest might be over the tops of some mountains and through some valleys. From past experience you know that you perform badly in programming contests after experiencing large differences in altitude. Therefore you decide to take the route that minimizes the altitude difference, where the altitude difference of a route is the difference between the maximum and the minimum height on the route. Your job is to write a program that finds this route.
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!)

 
Input
On the first line an integer t (1 <= t <= 100): the number of test cases. Then for each test case:

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.

 
Output
For each testcase, output one line with two integers separated by a single space:

the minimum altitude difference, and

the length of shortest path with this altitude difference.

 
Sample Input
1
7 9
4
9
1
3
3
5
4
1 2 1
2 3 1
3 4 1
4 7 1
1 5 4
5 6 4
6 7 4
5 3 2
6 4 2
 
Sample Output
2 11
 
 
Source
bapc2007_pre
 
Recommend
lcy
 
/*
题意:小明上学,从1到n,每个点都有高度,让你找出来一条高度差最小,这个条件下的最短路 初步思路:将所有的高度差计算出来,然后排序,从小到大找到第一个,能找到最短路的输出 #问题:很奇怪计算高度差的时候还要考虑和自身的高度差
*/
#include<bits/stdc++.h>
using namespace std;
struct Point{
int low,high;
Point(){}
Point(int a,int b){
low=a;
high=b;
}
bool operator < (const Point & b) const{
return (high-low)<(b.high-b.low);
}
};
int t;
int n,m;
int h[];
Point difference_h[*];
int u,v,val;
int tol=;
/*****************************************************spaf模板*****************************************************/
const int MAXN = ;
const int INF = 0x3f3f3f3f;
struct Edge {
int v;
int cost;
Edge(int _v = , int _cost = ) :
v(_v), cost(_cost) {
}
};
vector<Edge> E[MAXN];
void addedge(int u, int v, int w) {
E[u].push_back(Edge(v, w));
E[v].push_back(Edge(u, w));
}
bool vis[MAXN]; //在队列标志
int cnt[MAXN]; //每个点的入队列次数
int dist[MAXN];
bool SPFA(int start, int n,int low,int high) {
memset(vis, false, sizeof(vis));
for (int i = ; i <= n; i++)
dist[i] = INF;
vis[start] = true;
dist[start] = ;
queue<int> que;
while (!que.empty())
que.pop();
que.push(start);//将第一个点放进队列
memset(cnt, , sizeof(cnt));
cnt[start] = ;//标记一下这个点第一次进入队列中
while (!que.empty()) {
int u = que.front();
que.pop();
if(h[u]<low||h[u]>high)//控制高度差
continue;
vis[u] = false;
for (int i = ; i < E[u].size(); i++) {//遍历他所有能链接到的边
int v = E[u][i].v;
if (h[v]>=low&&h[v]<=high&&dist[v] > dist[u] + E[u][i].cost) {//进行缩点
dist[v] = dist[u] + E[u][i].cost;
if (!vis[v]) {//这个点没有访问过
vis[v] = true;
que.push(v);
if (++cnt[v] > n)
return false; //cnt[i]为入队列次数,用来判定是否存在负环回路
}
}
}
}
return true;
}
/*****************************************************spaf模板*****************************************************/
void init(){
for(int i=;i<=n;i++){
E[i].clear();
}
tol=;
}
int main(){
// freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
init();
for(int i=;i<=n;i++){
scanf("%d",&h[i]);
}
for(int i=;i<m;i++){
scanf("%d%d%d",&u,&v,&val);
//建图
addedge(u,v,val);
}
// cout<<"ok"<<endl;
for(int i=;i<=n;i++){
for(int j=i;j<=n;j++){
difference_h[tol].low=min(h[i],h[j]);
difference_h[tol++].high=max(h[i],h[j]);
}
}
// cout<<"ok"<<endl;
sort(difference_h,difference_h+tol);
for(int i=;i<tol;i++){
SPFA(,n,difference_h[i].low,difference_h[i].high);
if(dist[n]!=INF){
printf("%d %d\n",difference_h[i].high-difference_h[i].low,dist[n]);
break;
}
}
}
return ;
}

Cycling的更多相关文章

  1. URAL 1966 Cycling Roads 点在线段上、线段是否相交、并查集

    F - Cycling Roads     Description When Vova was in Shenzhen, he rented a bike and spent most of the ...

  2. Aquarium Cycling

    http://www.fishyou.com/aquarium-cycling.php Aquarium Cycling Aquarium cycling actually refers to the ...

  3. [USACO2002][poj1946]Cow Cycling(dp)

    Cow CyclingTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 2468 Accepted: 1378Description ...

  4. Cycling Label

    Cycling Label 来源: github/BBCyclingLabel Licence: Apache 2.0 作者: Bruno de Carvalho 分类: 标签(Label) 平台: ...

  5. Cow Cycling 动态规划

    1552: Cow Cycling 时间限制(普通/Java):1000MS/10000MS     内存限制:65536KByte总提交: 39            测试通过:20 描述 The ...

  6. Ural 1966 Cycling Roads

    ================ Cycling Roads ================   Description When Vova was in Shenzhen, he rented a ...

  7. URAL 1966 Cycling Roads 计算几何

    Cycling Roads 题目连接: http://acm.hust.edu.cn/vjudge/contest/123332#problem/F Description When Vova was ...

  8. cycling -avoid the vicious cycle

    ‘Numerous' studies in the past appear to have shown a link between cycling and ED. The researchers a ...

  9. UVALive - 6268 Cycling 贪心

    UVALive - 6268 Cycling 题意:从一端走到另一端,有T个红绿灯,告诉你红绿灯的持续时间,求最短的到达终点的时间.x 思路:

随机推荐

  1. 一篇搞定微信分享和line分享

    前言 在h5的页面开发中,分享是不可或缺的一部分,对于一些传播性比较强的页面,活动页之类的,分享功能极为重要.例如,京东等电商年末时会有一系列的总结h5在微信中传播,就不得不提到微信的分享机制. 微信 ...

  2. STM32获取DHT11温度传感器数据

    准备物件 STM32F103C8T6核心板 ST-LINK V2 DHT11 杜邦线若干 连接线 STM32F103C8T6芯片管脚图 管脚说明 连接仿真器 STM32 ST-LINKV2 VCC V ...

  3. jquery实现点击div外隐藏div

    html <div style="width:100px;height:100px;border:1px solid #ff0" id="div"> ...

  4. ThinkJS框架入门详细教程(一)开发环境

    一.前端标配环境 1.nodeJS正确安装,可以参考:http://www.cnblogs.com/chengxs/p/6221393.html 2.git正确安装,可以参考:http://www.c ...

  5. Bmob云IM实现头像更换并存入Bmob云数据库中(1.拍照替换,2.相册选择)

    看图效果如下: 1.个人资料界面 2.点击头像弹出对话框 3.点击拍照 4.切割图片,选择合适的部分 5.点击保存,头像替换完毕,下面看从相册中选择图片. 6.点击相册 7.任选一张图片 8.切割图片 ...

  6. HDU 5974 数学

    A Simple Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  7. JavaWeb(一)之细说Servlet

    前言 其实javaWeb的知识早就学过了,可是因为现在在搞大数据开发,所以web的知识都忘记了.准备开始慢慢的把Web的知识一点一点的回忆起来,多学一点没有关系,就怕到时候要用的话,什么都不会了. 一 ...

  8. Python数据分析(二): Numpy技巧 (2/4)

    numpy.pandas.matplotlib(+seaborn)是python数据分析/机器学习的基本工具. numpy的内容特别丰富,我这里只能介绍一下比较常见的方法和属性.   昨天晚上发了第一 ...

  9. Struts2和SpringMVC的区别

    简单谈一下Struts2和SpringMVC的区别,文章有所引用知乎所对应的答案数据,和所查看的其余资料数据,进行一个简单的汇总,后续查看时使用: 知乎解释链接为:https://www.zhihu. ...

  10. java 学习笔记——类之间的关系之封装、继承与多态的详解

    封装 一个封装的简单例子 封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口使之与外部发生联 ...