poj1502 MPI Maelstrom(单源最短路)

题意:表面乍一看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;
}
原文地址:https://www.cnblogs.com/WAautomaton/p/10947317.html