本文主要是介绍hud1598 find the mostcomfortable road,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
STEP5.1.51598 find the mostcomfortable road
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2910 Accepted Submission(s): 1224
Problem Description
XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
Input
输入包括多个测试实例,每个实例包括:
第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。
接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000
然后是一个正整数Q(Q<11),表示寻路的个数。
接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。
Output
每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。
Sample Input
4 4
1 2 2
2 3 4
1 4 1
3 4 2
2
1 3
1 2
Sample Output
1
0
题解:
这道题有事一道并查集,其实是参考了前辈们的代码,才写出来的。
并查集加暴力列举。
首先需要记录所有的路,然后按照路的速度排序(重点),排序后读入需要到达的两个城市,在这两个城市最舒适的路就是,在所有路中联通路径中差值最小的,所以我们需要通过不断的新定义并查集,查找路径中速度差最小的一个,其中由于路径是按照速度排序的,所以只需要用使路径连接的最后一条路径减去第一条路径。
源代码:
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
intr,l,v;
}road[1050];
int parent[250];
bool cmp(node a,node b)
{
returna.v < b.v;
}
void init(int n)
{
for(inti = 0;i <= n;i++)
parent[i]= i;
}
int find_parent(int a)
{
if(a== parent[a])
returna;
else
returnparent[a] = find_parent(parent[a]);
}
void Union(inta,int b)
{
intx = find_parent(a);
inty = find_parent(b);
if(x== y)
return;
else
parent[x]= y;
}
int main()
{
intn,m;
while(cin>> n >> m)
{
for(inti = 0;i < m;i++)
cin>> road[i].r >> road[i].l >> road[i].v;
sort(road,road+m,cmp);//按速度排序;
intq,a,b;
cin>> q;
for(inti = 0;i < q;i++)
{
cin>> a >> b;
intmn = 10000000;
for(intj = 0;j < m;j++)//找所有能够使通行的路径。
{
init(n);//每一次找路径都清零结点。
inten,k;
for(k= j;k < m;k++)
{
Union(road[k].r,road[k].l);//合并路径,
intx = find_parent(a);
inty = find_parent(b);
if(x== y)//如果当前路径已经联通,退出该循环
break;
}
if(k== m)//如果不能在j--m之间找到联通路径,j+1--m都能在找到联通路径了,所以退出循环。
break;
if(road[k].v- road[j].v < mn)//和所有路径的最小速度差相比较。
mn= road[k].v - road[j].v;
}
if(mn== 10000000)//如果mn不变的话则没有路径。
cout<< "-1" << endl;
else
cout<< mn << endl;
}
}
return0;
}
这篇关于hud1598 find the mostcomfortable road的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!