pku 1502 MPI Maelstrom

题意:有N个处理器,要传递信息,从1号开始,传播一次后可以从这两台处理器同时进行传播,以此类推

思路:样例画了个图,发现从1开始走到每个点的时候都是1到此点的最短路径,于是想到了spfa算1到每个点的距离,然后取最大值即可

code:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <string>
#include <cstdlib>
#define MAXN 105
#define INF 0x7fffffff
using namespace std;
int map[MAXN][MAXN];
int Max, n;
void spfa(int s, int e)    //spfa模板
{
    int i;
    int dist[MAXN];
    int visited[MAXN];
    queue<int> q;

    memset(visited, 0, sizeof(visited));
    for(i=1; i<=n; i++)
        dist[i]=INF;
    dist[s]=0;
    visited[s]=1;
    q.push(s);

    while(!q.empty())
    {
        int x = q.front();
        q.pop();
        visited[x] = 0;

        for(i=1; i<=n; i++)
            if(dist[x]+map[x][i]<dist[i] && dist[x]!=INF && map[x][i]!=INF)
            {
                dist[i]=dist[x]+map[x][i];
                if(!visited[i])
                {
                    visited[i]=1;
                    q.push(i);
                }
            }
    }
    Max=Max>dist[e]?Max:dist[e];
}
int main()
{
    scanf("%d", &n);
    Max=0;
    memset(map, 0, sizeof(map));
    for(int i=2; i<=n; i++)
    {
        for(int j=1; j<i; j++)
        {
            char lengh[10];
            int value;
            scanf("%s", lengh);
            if(lengh[0]=='x') value=INF;
            else value=atoi(lengh);
            map[i][j]=map[j][i]=value;
        }
    }
    for(int i=2; i<=n; i++)
    {
        spfa(1,i);
    }
    printf("%d\n", Max);
    return 0;
}

原文地址:https://www.cnblogs.com/FreeAquar/p/2090568.html