找第一个点到其他所有点的最短距离,因为是并行的,所以取最大的那个。
就是上一篇dijsktra改一下输入。
#include<iostream>
#include<algorithm>
#define maxn 100
using namespace std;
int edge[maxn][maxn];//邻接矩阵
int vis[maxn];//标记数组,如果这个点相邻边已经被松弛过,标记为1,下次遍历到的时候跳过
int dis[maxn];//存储1到i这个点现在的距离
void init(int n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
edge[i][j]=0;
else
edge[i][j]=1e9;
}
}
}
void dijkstra(int n)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
dis[i]=edge[1][i];
//找到现在距离1最近的点,一共要找n-1次
for(int i=2;i<=n;i++)
{
int minn=1e9;
int pos=-1;
for(int j=2;j<=n;j++)
{
if(vis[j]==1) continue;//松弛过
if(minn>dis[j])
{
pos=j;
minn=dis[j];
}
}
//标记
vis[pos]=1;
//松弛操作
for(int j=2;j<=n;j++)
{
if(j==pos) continue;
if(edge[pos][j]!=1e9)//这条边存在
{
dis[j]=min(dis[j],dis[pos]+edge[pos][j]);
}
}
}
}
int main()
{
int num;
cin>>num;//几个点
init(num);
//输入边的邻接矩阵
for(int i=1;i<=num;i++)
for(int j=1;j<i;j++)
{
char s[10];
scanf("%s",s);
if(s[0]!='x')
edge[i][j]=edge[j][i]=atoi(s);
}
dijkstra(num);
int ans=-1;
for(int i=2;i<=num;i++)
{
ans=max(ans,dis[i]);
}
cout<<ans<<endl;
}