find the most comfortable road

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
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 const int INF = 0x3f3f3f3f;
 6 
 7 int n,m,set[210];
 8 struct Edge
 9 {
10     int u,v;
11     int w;
12 } edge[1010];
13 int cmp(const struct Edge a, const struct Edge b)
14 {
15     return a.w < b.w;
16 }
17 void init()
18 {
19     for(int i = 1; i <= n; i++)
20         set[i] = i;
21 }
22 int find(int x)
23 {
24     if(set[x] != x)
25         set[x] = find(set[x]);
26     return set[x];
27 }
28 void merge(int x, int y)
29 {
30     int xx = find(x);
31     int yy = find(y);
32     if(xx != yy)
33         set[xx] = yy;
34 }
35 int main()
36 {
37     int i,j;
38 
39     while(~scanf("%d %d",&n,&m))
40     {
41         for(i = 0; i < m; i++)
42             scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].w);
43         sort(edge,edge+m,cmp);
44         
45         int test;
46         scanf("%d",&test);
47         while(test--)
48         {
49             int s,t;
50             scanf("%d %d",&s,&t);
51             int ans = INF;
52             for(i = 0; i < m; i++)
53             {
54                 init();
55                 for(j = i; j < m; j++)
56                 {
57                     merge(edge[j].u,edge[j].v);
58                     if(find(s) == find(t))
59                         break;
60                 }
61                 if(j >= m)
62                     break;
63                 if(ans > edge[j].w-edge[i].w)
64                     ans = edge[j].w-edge[i].w;
65             }
66             if(ans < INF)
67                 printf("%d
",ans);
68             else printf("-1
");
69         }
70     }
71     return 0;
72 }
View Code
 
原文地址:https://www.cnblogs.com/LK1994/p/3344010.html