• NYoj 最舒适的路线


     题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=711

    分析:枚举速度最大的边,找出能够从S到达T的最大速度,然后求出它们的比值,与已经求出的比值进行比较,如果比之前的比值小,则更新比值,记录此种情况下的最大速度和最小速度,直到枚举到从S不能到达T,跳出循环。求出最大速度和最小速度的比值即可。如果从S可以到达T,说明S和T属于同一个集合,因此可以利用并查集来判断从S是否可以到达T。

    代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <math.h>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <ctype.h>
     7 #include <iomanip>
     8 #include <queue>
     9 #include <stdlib.h>
    10 using namespace std;
    11 
    12 #define INF 0x3fffffff
    13 
    14 int f[5005];
    15 int n,m;
    16 
    17 struct lu
    18 {
    19     int start,end,speed;
    20 }num[5005];
    21 
    22 bool cmp(lu a,lu b)
    23 {
    24     return a.speed > b.speed;
    25 }
    26 
    27 int gcd(int a, int b)  
    28 {  
    29     while(b != 0)  
    30     {  
    31         int r = a % b;  
    32         a = b;  
    33         b = r;  
    34     }  
    35     return a;  
    36 } 
    37 
    38 void init(int n)
    39 {
    40     for(int i=0;i<=n;i++)
    41         f[i]=i;
    42 }
    43 
    44 int find(int x)
    45 {
    46     if(x==f[x])
    47         return f[x];
    48     f[x]=find(f[x]);
    49     return f[x];
    50 }
    51 
    52 void Union(int x,int y)
    53 {
    54     int p=find(x);
    55     int q=find(y);
    56     if(p > q)  
    57         f[p] = q;  
    58     else  
    59         f[q] = p;
    60 }
    61 int main()
    62 {
    63     int t;
    64     int a,b,i,j,aa,bb;
    65     scanf("%d",&t);
    66     while(t--){
    67         scanf("%d %d",&n,&m);
    68         for(i=0;i<m;i++)
    69             scanf("%d %d %d",&num[i].start,&num[i].end,&num[i].speed);
    70         sort(num,num+m,cmp);
    71         scanf("%d %d",&a,&b);
    72         double rate = INF*1.0;
    73         for(i=0;i<m;i++){
    74             init(n);
    75             for(j=i;j<m;j++){
    76                 if(find(num[j].start)!=find(num[j].end))
    77                     Union(num[j].start,num[j].end);
    78                 if(find(a)==find(b))
    79                     break;
    80             }
    81             if(j==m) break;
    82             int v1=num[i].speed,v2=num[j].speed;
    83             if(v1*1.0 / v2 < rate){
    84                 aa=v1,bb=v2;
    85                 rate=v1*1.0 / v2;
    86             }
    87         }
    88         if(rate == INF)
    89             printf("IMPOSSIBLE
    ");
    90         else if(aa % bb == 0)
    91             printf("%d
    ",aa/bb);
    92         else
    93             printf("%d/%d
    ",aa/ gcd(aa,bb),bb/ gcd(aa,bb));
    94     }
    95 }
  • 相关阅读:
    Windows下的SASS环境搭建
    cocos开发环境搭建
    cocos2d-x中描述精灵帧图片的plist和json文件各个key的含义
    seajs模块路径解析 简单总结
    【LESS系列】内置函数说明
    Zepto自定义模块打包构建
    【LESS系列】高级特性
    【LESS系列】三角形Mixins
    关于delete和对象复制
    vue使用技巧
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/4947593.html
Copyright © 2020-2023  润新知