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;
}