题意:表面乍一看output是输出最小值,但仔细研究可以发现,这个最小值是从点1到所有点所花时间的最小值,其实是访问这些节点中的最大值,因为只有访问了最长时间的那个点才算访问了所有点。所以求最短路之后求最大值。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn = 100 + 5; const int inf = 0x3f3f3f3f; int n, mp[maxn][maxn], dis[maxn]; bool vis[maxn]; inline int max( int a, int b ){ return a>b ? a:b; } inline int min( int a, int b ){ return a<b ? a:b; } inline int dij(){ memset( vis, 0, sizeof(vis) ); memset( dis, inf, sizeof(dis) ); dis[1] = 0; for( int i=1; i<n; i++ ){ int minid, MIN = inf; for( int j=1; j<=n; j++ ) if( !vis[j] && MIN>dis[j] ) MIN = dis[minid=j]; vis[minid] = 1; for( int j=1; j<=n; j++ ) if( !vis[j] ) dis[j] = min( dis[j], dis[minid]+mp[minid][j] ); } int res = -inf; for( int i=2; i<=n ;i++ ) res = max( res, dis[i] ); return res; } int main(){ // freopen("in.txt", "r", stdin); scanf("%d", &n); for( int i=2; i<=n; i++ ) for( int j=1; j<i; j++ ){ char s[10]; scanf("%s", s); if( s[0]=='x' ) mp[i][j] = mp[j][i] = inf; else{ int w = 0; for( int k=0; s[k]; k++ ){ w *= 10; w += s[k]-'0'; } mp[i][j] = mp[j][i] = w; } } printf("%d ", dij()); return 0; }