poj1502 MPI Maelstrom(单源最短路)

题意:表面乍一看output是输出最小值,但仔细研究可以发现,这个最小值是从点1到所有点所花时间的最小值,其实是访问这些节点中的最大值,因为只有访问了最长时间的那个点才算访问了所有点。所以求最短路之后求最大值。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int maxn = + ;
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, , sizeof(vis) );
memset( dis, inf, sizeof(dis) );
dis[] = ;
for( int i=; i<n; i++ ){
int minid, MIN = inf;
for( int j=; j<=n; j++ ) if( !vis[j] && MIN>dis[j] ) MIN = dis[minid=j];
vis[minid] = ;
for( int j=; j<=n; j++ ) if( !vis[j] ) dis[j] = min( dis[j], dis[minid]+mp[minid][j] );
}
int res = -inf;
for( int i=; i<=n ;i++ )
res = max( res, dis[i] );
return res;
} int main(){
// freopen("in.txt", "r", stdin);
scanf("%d", &n);
for( int i=; i<=n; i++ )
for( int j=; j<i; j++ ){
char s[];
scanf("%s", s);
if( s[]=='x' ) mp[i][j] = mp[j][i] = inf;
else{
int w = ;
for( int k=; s[k]; k++ ){
w *= ;
w += s[k]-'';
}
mp[i][j] = mp[j][i] = w;
}
}
printf("%d\n", dij()); return ;
}
上一篇:Js制作的文字游戏


下一篇:每天一水poj1502【最短路】