• 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 }
  • 相关阅读:
    斐波拉契数列
    判断润年
    欧拉回路
    走迷宫
    八连块问题
    知道一棵二叉树的前序和中序序列求二叉树的后续序列
    判断一个顺序排列的栈的输出序列
    Number Sequence
    如何去设计一个自适应的网页设计或HTMl5
    position
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6740984.html
Copyright © 2020-2023  润新知