题意 N个点 然后是一个N*N的矩阵 但是只有一半 其中说了mp[i][j]=mp[j][i] mp[i][i]=0 求从1号点到其他所有点用时的最少值
思路 因为到每个点的时间是有先后的 所以我们只需要求出1到所有点的最短路 然后取最大即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn=105;
int mp[maxn][maxn],vis[maxn],dis[maxn];
int n,sum=0;
string s;
int DJ(int n)
{
for(int i=1;i<=n;i++)
{
dis[i]=mp[1][i];
}
vis[1]=1;
for(int i=1;i<=n;i++)
{
int minn=inf;
int k=0;
for(int j=1;j<=n;j++)
{
if(!vis[j] && dis[j]<minn)
{
k=j;
minn=dis[j];
}
}
vis[k]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j] && dis[j]>dis[k]+mp[k][j])
{
dis[j]=dis[k]+mp[k][j];
}
}
}
for(int i=1;i<=n;i++)
{
sum=max(sum,dis[i]);
}
return sum;
}
int value(string s)
{
int len = s.length();
int ans=0;
for(int i=len-1,j=1;i>=0;i--,j*=10)
{
ans+=(s[i]-'0')*j;
}
return ans;
}
int main()
{
memset(mp,inf,sizeof(mp));
memset(vis,0,sizeof(vis));
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(i==j)
{
mp[i][j]=0;
continue;
}
cin>>s;
if(s!="x") mp[i][j]=mp[j][i]=value(s);
else mp[i][j]=mp[j][i]=inf;
}
}
cout<<DJ(n)<<endl;
return 0;
}