N个处理器要进行信息传递,处理器i传递信息给自己不需要时间,处理器i与处理器j之间相互传递信息的时间是一样的,不同处理器之间传递信息所需要的时间由一个矩阵的下三角给出。若矩阵对应位置为x,则说明相应的两个处理器之间无法传递信息。求从第一个处理器传递信息到其他所有处理器最少需要多少时间。
特殊处理一下值为x的情况,建立邻接阵,运用单源最短路径算法求出第一个处理器到其他所有处理器的最短传递信息时间,然后取这些最短时间中的最大者即可
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int N = 110;
int dis[N], visit[N], edge[N][N];
char s[N];
const int inf = 0x3f3f3f3f;
int main()
{
int n;
while(scanf("%d", &n)!=EOF)
{
memset(edge,-1,sizeof(edge));
for(int i=1;i<=n;i++)
{
dis[i]=inf;
edge[i][i]=0;
for(int j=1;j<i;j++)
{
scanf(" %s",s);
if(s[0]=='x')
{
edge[i][j]=edge[j][i]=inf;
}
else
{
edge[i][j]=edge[j][i]=atoi(s); //转化为数字,在stdlib中
}
}
}
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)
{
dis[i]=edge[1][i];
}
visit[1]=1;
for(int i=1;i<n;i++)
{
int u, x=inf;
for(int j=1;j<=n;j++)
{
if(dis[j]!=-1&&dis[j]<x&&visit[j]==0)
{
x=dis[j];
u=j;
}
}
if(x==inf)
{
break;
}
visit[u]=1;
for(int j=1;j<=n;j++)
{
if(edge[u][j]!=-1&&edge[u][j]+dis[u]<dis[j]&&!visit[j])
{
dis[j]=edge[u][j]+dis[u];
}
}
}
int sum=0;
for(int i=1;i<=n;i++)
{
sum=max(sum,dis[i]);
}
printf("%d\n",sum);
}
return 0;
}