题意:就是求1到其它节点最短路中最大的,因为消息可以同时传播,类似于poj 1125
思路:floyd,最后枚举1到其它节点的最短路,求出其中最大的输出
#include<iostream>
#include<stdlib.h>
#define inf 0xfffffff
using namespace std;
int dist[105][105];
int n;
void floyd()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(dist[i][k]+dist[k][j]<dist[i][j])
dist[i][j]=dist[i][k]+dist[k][j];
return ;
}
int main()
{
int i,j,min;
char a[10];
while(scanf("%d",&n)!=EOF)
{
//memset(dist,inf,sizeof(dist));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j) dist[i][j]=inf;
else dist[i][j]=0;//如果i=j说明是同一个节点,赋值为0,如果都初始化为最大值,会出错,dist[i][j]会有负数出现。。不理解。但是如果把dist[i][k]>0&&dist[k][j]>0&&dist[i][j]>0加在floyd()函数里,结果依然正确。。
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)
{
scanf("%s",a);
if(a[0]=='x')
{
dist[i][j]=dist[j][i]=inf;
}
else
dist[i][j]=dist[j][i]=atoi(a);
}
}
floyd();
//for(i=1;i<=n;i++)
//for(j=1;j<=n;j++)
//printf("%d ",dist[i][j]);
//system("pause");
min=0;
for(i=1;i<=n;i++)
{
if(dist[1][i]>min)
min=dist[1][i];
}
printf("%d\n",min);
}
}