luogu1099[树网的核]

来源:互联网 发布:linux双系统怎么切换 编辑:程序博客网 时间:2024/05/17 01:22

最短路+枚举

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 305 ;const int Inf = 1e9; int w [N] [N] ;int main () {    int n , s ;    scanf ("%d%d", &n , &s ) ;    for ( int i = 1 ; i <= n ; ++ i )        for ( int j = 1 ; j <= n ;++ j )            if ( i != j ) w [i] [j] = Inf ;    for ( int i = 1 ; i < n ; ++ i ) {        int u , v , w1 ;        scanf ( "%d%d%d" , &u , &v , &w1 ) ;        w [u] [v] = w [v] [u] = w1 ;    }    for ( int k = 1 ; k <= n ; ++ k )        for ( int i = 1 ; i <= n ; ++ i )            for ( int j = 1 ; j <= n ; ++ j )                if ( w [i] [k] != Inf && w [k] [j] != Inf )                     w [i] [j] = min ( w [i] [j] , w [i] [k] + w [k] [j] );    int mi , mj , mx = 0 , ans = Inf ;    for ( int i = 1 ; i <= n ; ++ i )         for ( int j = 1 ; j <= n ; ++ j ) if ( w [i] [j] < Inf && w [i] [j] > mx ) {            mx = w [i] [j] ;            mi = i , mj = j ;        }    for ( int i = 1 ; i <= n ; ++ i ) if ( w [mi] [i] + w [i] [mj] == w [mi] [mj] )         for ( int j = 1 ; j <= n ; ++ j ) if ( w [mi] [j] + w [j] [mj] == w [mi] [mj] ){            if ( w [i] [j] > s ) continue ;            int ecc = 0 , ek;            for ( int k = 1 ; k <= n ; ++ k )                ecc = max ( ecc , ( w [i] [k] + w [j] [k] - w [i] [j] ) >> 1 );             ans = min ( ans , ecc ) ;        }    printf ( "%d" , ans ) ;    return 0;}