zoukankan      html  css  js  c++  java
  • BZOJ 1631: [Usaco2007 Feb]Cow Party( 最短路 )

    这道题和蔡大神出的今年STOI初中组的第二题几乎一模一样...

    先跑一遍最短路 , 再把所有边反向 , 再跑一遍 , 所有点两次相加的最大值即为answer 

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

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    #include<iostream>
    #include<vector>
     
    #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 = 1000 + 5;
    const int inf = 0x7fffffff;
     
    typedef pair< int , int > edge;
     
    int cur = 0;
    int n;
     
    vector< edge > E[ 2 ][ maxn ];
      

    void init() {

    rep( i , n ) 
       E[ 0 ][ i ].clear() , E[ 1 ][ i ].clear();
    }
     
    inline void add( int x , int u , int v , int d ) {
    E[ x ][ u ].push_back( make_pair( v , d ) );
    }
     
    inline void add_edge( int u , int v , int d ) {
    add( 0 , u , v , d );
    add( 1 , v , u , d );
    }
     
    bool inQ[ maxn ];
    int d[ 2 ][ maxn ];
    queue< int > Q;
     
    void spfa( int S ) {
    rep( i , n )
       d[ cur ][ i ] = inf;
    d[ cur ][ S ] = 0;
       
    clr( inQ , 0 );
    while( ! Q.empty() ) Q.pop();
    Q.push( S );
    while( ! Q.empty() ) {
    int x = Q.front();
    Q.pop();
    inQ[ x ] = false;
    for( vector< edge > :: iterator e = E[ cur ][ x ].begin() ; e != E[ cur ][ x ].end() ; e++ ) {
    int to = e -> first , dist = e -> second;
    if( d[ cur ][ to ] > d[ cur ][ x ] + dist ) {
    d[ cur ][ to ] = d[ cur ][ x ] + dist;
    if( ! inQ[ to ] ) 
       inQ[ to ] = true , Q.push( to );
       
    }
    }
    }
    }
     
    int main() {
    // freopen( "test.in" , "r" , stdin );
    init();
    int m , s;
    cin >> n >> m >> s;
    --s;
    while( m-- ) {
    int u , v , d;
    scanf( "%d%d%d" , &u , &v , &d );
    u-- , v--;
    add_edge( u , v , d );
    }
    spfa( s );
    cur ^= 1;
    spfa( s );
    int ans = 0;
    rep( i , n ) 
       ans = max( ans , d[ 0 ][ i ] + d[ 1 ][ i ] );
       
    cout << ans << " ";
    return 0;
    }

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

    1631: [Usaco2007 Feb]Cow Party

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 524  Solved: 388
    [Submit][Status][Discuss]

    Description

        农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最少的路线.那么,用时最多的奶牛需要多少时间来回呢?

    Input

    第1行:三个用空格隔开的整数.

     第2行到第M+1行,每行三个用空格隔开的整数:Ai, Bi,以及Ti.表示一条道路的起点,终点和需要花费的时间.

    Output

    唯一一行:一个整数: 所有参加聚会的奶牛中,需要花费总时间的最大值.

    Sample Input

    4 8 2
    1 2 4
    1 3 2
    1 4 7
    2 1 1
    2 3 5
    3 1 2
    3 4 4
    4 2 3

    Sample Output

    10

    HINT

    样例说明:


    共有4只奶牛参加聚会,有8条路,聚会位于第2个农场.


    第4只奶牛可以直接到聚会所在地(花费3时间),然后返程路线经过第1和第3个农场(花费7时间),总共10时间. 

    Source

  • 相关阅读:
    tomcat9.x 集群升级至 tomcat 10.x 发现的问题....
    java8 快速实现List转map 、分组、过滤等操作
    java高亮显示关键字不区分大小写(但不改变原文字母的大小写)---关键字分词功能(自写算法:关键字之间有子集的情况和关键字首尾拼接)
    Java Array、List、Set互相转化
    java 查找list中重复数据
    Java Set对象去重
    Java--如何高效向List中存放不重复的数据(附带时间测试)
    java list的交集,差集,并集
    Java中枚举实现单例模式
    使用jsoup选择器来查找元素
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4556908.html
Copyright © 2011-2022 走看看