1001 舒适的路线

1001 舒适的路线

2006年

时间限制: 2 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题目描述 Description

Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。
Z小镇附近共有
N(1<N≤500)个景点(编号为1,2,3,…,N),这些景点被M(0<M≤5000)条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路。也许是为了保护该地的旅游资源,Z小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车辆速度必须为Vi。频繁的改变速度使得游客们很不舒服,因此大家从一个景点前往另一个景点的时候,都希望选择行使过程中最大速度和最小速度的比尽可能小的路线,也就是所谓最舒适的路线。

输入描述 Input Description

第一行包含两个正整数,N和M。
接下来的M行每行包含三个正整数:x,y和v(1≤x,y≤N,0 最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比最小的路径。s和t不可能相同。

输出描述 Output Description

如果景点s到景点t没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。

样例输入 Sample Input

样例1
4 2
1 2 1
3 4 2
1 4

样例2
3 3
1 2 10
1 2 5
2 3 8
1 3

样例3
3 2
1 2 2
2 3 4
1 3

样例输出 Sample Output

样例1
IMPOSSIBLE

样例2
5/4

样例3
2

数据范围及提示 Data Size & Hint

N(1<N≤500)

M(0<M≤5000)

Vi在int范围内

思路:把边按边长从小到大排序,枚举i所有边,然后从依次添边,直到x和y相连,每次对最长边与最短边的比值取小即为答案。

 1 #include<iostream>
 2 using namespace std;
 3 #include<cstdio>
 4 #include<algorithm>
 5 struct node{
 6     int a,b,c;
 7 }rd[5001];
 8 int far[501];
 9 int n,m,x,y;
10 double ans=9999999,tmp;
11 int xx,yy;
12 int find(int a)
13 {
14     return a==far[a]?a:far[a]=find(far[a]);
15 }
16 bool cmp(node a,node b)
17 {
18     return a.c<b.c;
19 }
20 int gcd(int a,int b)
21 {
22     if(a%b==0)return b;
23     else return gcd(b,a%b);
24 }
25 int main()
26 {
27     cin>>n>>m;
28     for(int i=1;i<=m;++i)
29     {
30         int a,b,c;
31         scanf("%d%d%d",&a,&b,&c);
32         rd[i].a=a;
33         rd[i].b=b;
34         rd[i].c=c;
35     }
36     cin>>x>>y;
37     sort(rd+1,rd+m+1,cmp);  //排序边 
38     bool b=0;
39     for(int i=1;i<=m;++i)  //枚举所有边(x和y连通时,i是最大的) 
40     {
41         for(int j=1;j<=n;++j)far[j]=j;
42         for(int j=i;j;--j)  //继续枚举比i小的边(x和y连通时,j是最小的,所以比值就是i边比j边)) 
43         {
44             int r=find(rd[j].a),rr=find(rd[j].b);
45             if(r!=rr)far[r]=rr;
46             if(find(x)==find(y))  
47             {
48                 tmp=(double(rd[i].c)/double(rd[j].c));
49                 if(ans>tmp)  //取小 
50                 {
51                     ans=tmp;
52                     xx=rd[i].c;
53                     yy=rd[j].c;
54                 }
55                 b=1; 
56                 break;
57             }
58         }
59     }
60     if(!b)printf("IMPOSSIBLE");
61     else
62     {
63         if(xx%yy==0)printf("%d",xx/yy);
64         else 
65         {
66             int g=gcd(xx,yy);
67             printf("%d/%d",xx/g,yy/g);
68         }
69     }
70     return 0;
71 }
原文地址:https://www.cnblogs.com/mjtcn/p/6740984.html