• ural Rally Championship(floyd求最长路)


    题意:有N座城市,M条路,求是否有两座城市间的路长度大于等于s。

    思路:题目中说这条路可以是任意地方开始,任意地方结束,所以只要有一条路大于等于s就可以了。可以先用排除法来确保这个图为无向无环图。

    1)如果图中有环,输出“YES”;

    2)如果图中有自环,输出“YES”;

    3)如果图中有重边,输出“YES” ;

    在输入的时候判断一下,然后用floyd求最长路,所有路中有一条路长度大于等于s就可以完成。

    代码:

    View Code
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #define  N 103
    #define  INF 100000000
    using namespace std ;
    
    int mp[N][N] , f[N] ;
    queue<int>q ;
    int n , m , s ;
    
    void init()
    {
        for ( int i = 0 ; i <= n ; i++ )
        {
            f[i] = i ;
            for( int j = 0 ; j <= n ; j++ )
            mp[i][j] = -INF ;
        }
        while ( !q.empty()) q.pop();
    }
    
    int find( int x )
    {
        if ( x != f[x] )
        f[x] = find( f[x] );
        return f[x] ;
    }
    
    int main()
    {
        int i , j , k , x , y , l ;
        bool flag ;
        int a , b ;
    
        while ( scanf ( "%d%d%d" , &n , &m , &s ) != EOF )
        {
            init() ;
            flag = true ;
            for ( i = 1 ; i <= m ; i++ )
            {
                scanf ( "%d%d%d" , &x , &y , &l ) ;
                if ( flag )
                {
                    if ( x == y )
                    {
                        flag = false ;
                    }
                    else if ( mp[x][y] == -INF )
                    {
                        mp[x][y] = mp[y][x] = -l ;
                        a = find( x ) ;
                        b = find( y ) ;
                        if ( a == b )
                        {
                            flag = false ;
                        }
                        else
                        {
                            f[a] = b ;
                        }
                    }
                    else
                    {
                        flag = false ;
                    }
                }
            }
            if ( !flag )
            {
                printf ( "YES\n" ) ;
                continue ;
            }
            else
            {
                for ( i = 1 ; i <= n ; i++ )
                {
                    for ( j = 1 ; j <= n ; j++ )
                    {
                        for ( k = 1 ; k <= n ; k++ )
                        {
                            if ( mp[j][i] == -INF || mp[i][k] == -INF )
                            continue ;
                            if ( mp[j][i] + mp[i][k] > mp[j][k] )
                            mp[j][k] = mp[j][i] + mp[i][k] ;
                        }
                    }
                }
                flag = false ;
                for ( i = 1 ; i <= n ; i++ )
                {
                    for ( j = i+ 1  ; j <= n ; j++ )
                    if ( mp[i][j] != -INF &&  abs( mp[i][j] ) >= s )
                    {
                        flag = true ;
                        break ;
                    }
                    if ( flag )
                    break ;
                    /*cout<<abs(mp[i][j])<<" " ;
                    cout<<endl ;*/
                }
                if ( flag )
                printf ( "YES\n" ) ;
                else
                printf ( "NO\n" ) ;
            }
        }
        return 0 ;
    }
  • 相关阅读:
    [CSP-S模拟测试]:Merchant(二分答案)
    [CSP-S模拟测试]:回文(hash+二维前缀和)
    [CSP-S模拟测试]:排列组合(数学 or 找规律)
    [CSP-S模拟测试]:X国的军队(贪心)
    BZOJ3714 [PA2014]Kuglarz 【最小生成树】
    BZOJ3922 Karin的弹幕 【线段树】
    BZOJ3495 PA2010 Riddle 【2-sat】
    BZOJ2597 [Wc2007]剪刀石头布 【费用流】
    hdu6184 Counting Stars 【三元环计数】
    BZOJ4815 [CQOI2017]小Q的表格 【数论 + 分块】
  • 原文地址:https://www.cnblogs.com/misty1/p/2879802.html
Copyright © 2020-2023  润新知