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\n",ans);

68             else printf("-1\n");

69         }

70     }

71     return 0;

72 }
View Code

 

 

你可能感兴趣的:(table)