题意:有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;
}