hdu1598 find the most comfortable road (枚舉)+【並查集】
阿新 • • 發佈:2018-10-08
起點 efi super clas 更新 .net tput 即使 dci
但XX星人對時間卻沒那麽多要求。要你找出一條城市間的最舒適的路徑。(SARS是雙向的)。
接下來的行是三個正整數StartCity,EndCity,speed,表示從表面上看StartCity到EndCity,限速為speedSARS。speed<=1000000
然後是一個正整數Q(Q<11),表示尋路的個數。
接下來Q行每行有2個正整數Start,End, 表示尋路的起終點。
<題目鏈接>
題目大意:
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 (枚舉)+【並查集】