题目大意:输出n,表示有n个点,完整的图为一个矩阵,相当于二维数组a[n][n]的样子,a[i][j]就是i点到j点的距离。其中只给出了下三角,x表示亮点直接不连通。输出用最短方式从1走到其他点,其中最远的距离。
解题思路:dijkstra,最基本的单源点问题。
ac代码:
#include <iostream>
#include <cstring>
#define inf 100005
using namespace std;
int n, dis[105], w[105][105], t1, t2, vis[105], Max;
char a[105];
int main()
{
while (scanf("%d", &n)!=EOF){
memset(vis, 0, sizeof(vis));
for (int i=1; i<=n; i++)
w[i][i] = 0, dis[i] = inf;
for (int i=2; i<=n; i++){
for (int j=1; j<i; j++){
scanf("%s", a);
if (a[0] == 'x')
w[i][j] = w[j][i] = inf;
else{
sscanf(a, "%d", &w[i][j]);
w[j][i] = w[i][j];
}
}
}
for (int i=2; i<=n; i++)
dis[i] = w[1][i];
vis[1] = 1;
for (int i=0; i<n; i++){
t1 = inf;
for (int j=2; j<=n; j++)
if (dis[j] < t1 && !vis[j])
t1 = dis[j], t2 = j;
vis[t2] = 1;
for (int j=2; j<=n; j++)
dis[j] = min(dis[j], t1+w[j][t2]);
}
Max = dis[2];
for (int i=3; i<=n; i++)
Max = max(Max, dis[i]);
printf("%d\n", Max);
}
return 0;
}