zoukankan      html  css  js  c++  java
  • BZOJ 1050: [HAOI2006]旅行comf( 并查集 )

    将edge按权值排序 , O( m² ) 枚举边 , 利用并查集维护连通信息. 

    -----------------------------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
     
    #define rep( i , n ) for( int i = 0 ; i < n ; ++i )
    #define clr( x , c ) memset( x , c ,sizeof( x ) )
      
    using namespace std;
     
    const int maxn = 500 + 5;
    const int maxm = 5000 + 5;
     
    int n;
     
    int gcd( int a , int b ) {
    return b ? gcd( b , a % b ) : a;
    }
     
    struct edge {
    int u , v , d;
    void Read() {
    scanf( "%d%d%d" , &u , &v , &d );
    u-- , v--;
    }
    bool operator < ( const edge &e ) const {
    return d < e.d;
    }
    };
     
    int p[ maxn ];
     
    inline void UF_init() {
    rep( i , n ) p[ i ] = i;
    }
     
    int find( int x ) {
    return x == p[ x ] ? x : p[ x ] = find( p[ x ] );
    }
     
    edge E[ maxm ];
      

    int main() {

    int m;
    cin >> n >> m;
    rep( i , m ) E[ i ].Read();
    int s , t;
    cin >> s >> t;
    s-- , t--;
    sort( E , E + m );
    pair< int , int > ans( -1 , -1 );
    rep( i , m ) {
    UF_init();
    int Min = E[ i ].d , Max;
    for( int j = i ; j < m ; ++j ) {
    int a = find( E[ j ].u ) , b = find( E[ j ].v );
    if( a != b )
       p[ a ] = b , Max = E[ j ].d;
       
    if( find( s ) == find( t ) ) {
    if( ans.first * 1.0 / ans.second > Max * 1.0 / Min || ans.first == -1)
       ans = make_pair( Max , Min );
    break;
    }
    }
    }
    if( ans.first == -1 ) 
       printf( "IMPOSSIBLE " );
    else {
    int a = ans.first , b = ans.second;
    int c = gcd( a , b );
    if( c == b ) 
       printf( "%d " , a / b );
    else 
       printf( "%d/%d " , a / c , b / c );
    }
    return 0;
    }

      

    ----------------------------------------------------------------------------------------- 

    1050: [HAOI2006]旅行comf

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1775  Solved: 898
    [Submit][Status][Discuss]

    Description

    给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T,求一条路径,使得路径上最大边和最小边的比值最小。如果S和T之间没有路径,输出”IMPOSSIBLE”,否则输出这个比值,如果需要,表示成一个既约分数。 备注: 两个顶点之间可能有多条路径。

    Input

    第一行包含两个正整数,N和M。 下来的M行每行包含三个正整数:x,y和v。表示景点x到景点y之间有一条双向公路,车辆必须以速度v在该公路上行驶。 最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比最小的路径。s和t不可能相同。

    Output

    如果景点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

    HINT

    【数据范围】

    1<  N < = 500

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

    0 < M < =5000

    Source

  • 相关阅读:
    python使用matplotlib:subplot绘制多个子图 不规则画图
    Python_matplotlib画图时图例说明(legend)放到图像外侧
    python ndarray与pandas series相互转换,ndarray与dataframe相互转换
    用Python实现excel 14个常用操作
    Python中保留两位小数的几种方法
    画图显示中文
    python命名规范
    Alpha阶段小结
    敏捷冲刺每日报告——Day5
    敏捷冲刺每日报告——Day4
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4541969.html
Copyright © 2011-2022 走看看