Sample Input
5
50
30 5
100 20 50
10 x x 10
Sample Output
35
题意:
给你一个临界矩阵,x表示两点间不可达,由于自身到自身话费时间为0,所以没有给出,由于i到j和j到i距离相同,互达时间相同,
所以只给出了一半的临界矩阵。根据给你的这个临界矩阵,让你来求从点1到其他点所花费时间的最大值。
#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<memory.h>
#include<cmath>
#define MaxN 110
#define MaxInt 200000000
using namespace std;
int map[MaxN][MaxN],dist[MaxN];
bool mark[MaxN];
int n,start,end;
char a[1000];
int main()
{
int min1,minj,temp;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=map[j][i]=MaxInt;
for(int i=2;i<=n;i++)
for(int j=1;j<i;j++)
{
cin>>a;
if(a[0]=='x')
map[i][j]=map[j][i]=MaxInt;
else
{
map[i][j]=0;
int l;
l=strlen(a);
for(int k = 0;k < l;k++)
{
map[i][j] *= 10;
map[i][j]+= (a[k] - 48);
}
map[j][i]=map[i][j];
}
}
for (int i=1;i<=MaxN;i++) dist[i]=MaxInt;
memset(mark,0,sizeof(mark));
dist[1]=0; //把起点并入集合,搜索时就可以从起点寻找到第一条最短的边了
//*********************************************
for (int i=1;i<=n-1;i++)
{
min1=MaxInt;
for (int j=1;j<=n;j++) //查找到原集合的最短的边
{
if (!mark[j]&&dist[j]<min1)
{
min1=dist[j];
minj=j;
}
}
mark[minj]=1;
for (int j=1;j<=n;j++) //每并入一个点都要对原来的边进行修正,保证任意时刻源点到目标点的距离都是最短的。
{
if (!mark[j]&&map[minj][j]>0)
{
temp=dist[minj]+map[minj][j];
if (temp<dist[j])
dist[j]=temp;
}
}
}
for(int i=2;i<=n;i++)
{
if(dist[i]>dist[1])
dist[1]=dist[i];
}
//***********输出***************
printf("%d\n",dist[1]);
}
}