hdu1589(枚举+并查集)
find the most comfortable road
Time Limit: 1000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9735????Accepted Submission(s): 4055
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
解析:很難想到用并查集
對于題目中的路,按速度進行排序,這樣,如果從第 i 條路到第 j 條路之間的所有路能夠讓 i 和 j 連通,那么,這就存在一條路,且這條路的舒適度就是 兩者的差值。 ?這樣,只要枚舉從每一條路開始,向前找到可以使得 起點和終點連通的路的舒適度,就可以找到答案了
#include<bits/stdc++.h> using namespace std;#define ee exp(1) #define pi acos(-1) #define mod 1000000007 #define inf 0x3f3f3f3f #define ll long long #define ull unsigned long long #define mem(a,b) memset(a,b,sizeof(a)) int gcd(int a,int b){return b?gcd(b,a%b):a;}struct node{int u,v,w; }e[1005]; int f[205]; int n,m,ans; int cmp(node a,node b) {return a.w<b.w; } void init() {for(int i=0; i<=n; i++){f[i]=i;} } int Find(int x) {return x==f[x]?f[x]:Find(f[x]); } void join(int x,int y) {int fa=Find(x);int fb=Find(y);if(fa!=fb){f[fa]=fb;}return; } int main() {while(~scanf("%d%d",&n,&m)){for(int i=0; i<m; i++){scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);}sort(e,e+m,cmp);int q;scanf("%d",&q);while(q--){int x,y;scanf("%d%d",&x,&y);ans=inf;for(int i=0; i<m; i++){init();int flag=0,k=0;for(int j=i; j<m; j++){join(e[j].u,e[j].v);if(Find(x)==Find(y)){flag=1;k=j;break;}}if(!flag)break;ans=min(ans,e[k].w-e[i].w);}if(ans==inf)printf("-1\n");else printf("%d\n",ans);}}return 0; }?
總結
以上是生活随笔為你收集整理的hdu1589(枚举+并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1597(二分)
- 下一篇: Word2Vec训练同义词模型