find the most comfortable road
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3686 Accepted Submission(s): 1565
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 <stdio.h> #include <string.h> #include <limits.h> #include <algorithm> #define maxn 202 #define maxm 1002 using std::sort; using std::min; int pre[maxn]; struct Node{ int u, v, cost; } E[maxm]; int ufind(int k) { int a = k, b; while(pre[k] != -1) k = pre[k]; while(a != k){ b = pre[a]; pre[a] = k; a = b; } return k; } bool cmp(Node a, Node b){ return a.cost < b.cost; } int main() { int n, m, q, a, b, i, j, x, y, ans; while(scanf("%d%d", &n, &m) == 2){ for(i = 0; i < m; ++i) scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].cost); sort(E, E + m, cmp); scanf("%d", &q); while(q--){ scanf("%d%d", &a, &b); ans = INT_MAX; for(i = 0; i < m; ++i){ memset(pre, -1, sizeof(pre)); for(j = i; j < m; ++j){ x = ufind(E[j].u); y = ufind(E[j].v); if(x != y) pre[x] = y; if(ufind(a) == ufind(b)){ ans = min(ans, E[j].cost - E[i].cost); break; } } } if(ans == INT_MAX) printf("-1\n"); else printf("%d\n", ans); } } return 0; }
HDU1598 find the most comfortable road 【并查集】+【枚举】