1. 程式人生 > >hdu1598 find the most comfortable road (枚舉)+【並查集】

hdu1598 find the most comfortable road (枚舉)+【並查集】

起點 efi super clas 更新 .net tput 即使 dci

<題目鏈接>

題目大意:

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 <cstdio>
#include <algorithm>
using namespace std;

#define INF 0x3f3f3f3f
#define M 205
struct EDGE{
    int x,y,val;
}edge[1005];
int father[M],n,m;
void init(){
    for(int i=1;i<=n;i++)father[i]=i;
}
int find(int x){
    if(father[x]==x)return x;
    father[x]=find(father[x]);
    
return father[x]; } bool cmp(EDGE a,EDGE b){ return a.val<b.val; } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=m;i++)scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].val); sort(edge+1,edge+1+m,cmp); int q;scanf("%d",&q); while(q--){ int s,e;scanf("%d%d",&s,&e); mn=INF; for(int i=1;i<=m;i++){ //枚舉最小邊 init(); bool fp=false; for(int j=i;j<=m;j++){ //尋找最大邊 int f1=find(edge[j].x); int f2=find(edge[j].y); if(f1!=f2){ father[f2]=f1; } if(find(s)==find(e)){ //判斷起點與終點是否連通 fp=true; mn=min(mn,edge[j].val-edge[i].val); //更新最大、最小邊權之差 } } if(!fp)break; //如果從第i條邊開始,即使連上了所有邊也不能使起點、終點連通,就直接跳出,因為後面從i+1,i+2開始的所有邊連接後也不能使起點、終點連通 } if(mn==INF)printf("-1\n"); else printf("%d\n",mn); } } return 0; }


2018-10-07

hdu1598 find the most comfortable road (枚舉)+【並查集】