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 ; }