• P2502 [HAOI2006]旅行


    题目描述

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

    输入输出格式

    输入格式:

    第一行包含两个正整数,N和M。

    接下来的M行每行包含三个正整数:x,y和v。表示景点x到景点y之间有一条双向公路,车辆必须以速度v在该公路上行驶。

    最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比最小的路径。s和t不可能相同。

    输出格式:

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

    输入输出样例

    输入样例#1: 复制
    4 2
    1 2 1
    3 4 2
    1 4
    输出样例#1: 复制
    IMPOSSIBLE
    输入样例#2: 复制
    3 3
    1 2 10
    1 2 5
    2 3 8
    1 3
    输出样例#2: 复制
    5/4
    输入样例#3: 复制
    3 2
    1 2 2
    2 3 4
    1 3
    输出样例#3: 复制
    2

    说明

    【数据范围】

    1<N≤500

    1≤x,y≤N,0<v<30000,x≠y

    0<M≤5000

    //Pro:P2502 [HAOI2006]旅行
    
    //这道题的做法大概是挺暴力的。。。
    //在query的时候,枚举每一条边,用从这条边之后的边建最小生成树,然后不断更新ans
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    inline int read()
    {
        char c=getchar();int num=0;
        for(;!isdigit(c);c=getchar());
        for(;isdigit(c);c=getchar())
            num=num*10+c-'0';
        return num;
    }
    
    const int N=5e2+5;
    const int M=5e3+5;
    
    int n,m,S,T;
    int maxn,minn;
    struct Edge
    {
        int u,v,w;
        bool operator < (const Edge &a) const
        {
            return this->w<a.w;
        }
    }edge[M];
    int fa[N];
    
    int find(int x)
    {
        return x==fa[x]?x:fa[x]=find(fa[x]);
    }
    
    int gcd(int a,int b)
    {
        int c;
        while(b)
        {
            c=a;
            a=b;
            b=c%b;
        }
        return a;
    }
    
    bool flag;
    double ANS=123456789;
    int MAXN,MINN;
    int main()
    {
        n=read(),m=read();
        for(int i=1;i<=m;++i)
        {
            edge[i].u=read(),
            edge[i].v=read(),
            edge[i].w=read();
        }
        S=read(),T=read();
        sort(edge+1,edge+m+1);
        for(int i=1;i<=m;++i)
        {
            for(int j=1;j<=n;++j)
                fa[j]=j;
            maxn=-1,minn=0x7fffffff;
            flag=0;
            for(int j=i,fx,fy;j<=m;++j)
            {
                fx=find(edge[j].u),fy=find(edge[j].v);
                maxn=max(maxn,edge[j].w);
                minn=min(minn,edge[j].w);
                if(fx==fy)
                    continue;
                fa[fx]=fy;
                if(find(S)==find(T))
                {
                    flag=1;
                    break;
                }
            }
            if(!flag)
                break;
            if((double)1.0*maxn/(double)minn<ANS)
            {
                MAXN=maxn,MINN=minn;
                ANS=(double)1.0*maxn/(double)minn;
            }
        }
        if(ANS==123456789)
            puts("IMPOSSIBLE");
        else
        {
    //        printf("%f
    ",ANS);
            int g=gcd(MAXN,MINN);
    //        cout<<MAXN<<"  "<<MINN<<'
    ';
    //        cout<<g<<endl;
            if(MINN/g==1)
                printf("%d",MAXN/g);
            else
                printf("%d/%d",MAXN/g,MINN/g);
        }
        return 0;
    }
  • 相关阅读:
    打包其他资源(除html/css/js 资源以外的资源)
    打包图片资源
    打包html资源
    css3
    Webpack 入门(一):安装 / 打包 / 命令行
    手动配置webpack
    实现登录
    回调函数和钩子函数
    不能局部安装webpack的解决方法
    Vue.js双向绑定的实现原理
  • 原文地址:https://www.cnblogs.com/lovewhy/p/9030932.html
Copyright © 2020-2023  润新知