#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[105][105],dp1[105][105];
int n,m,k,l,r=1e11;
bool check(int x)
{
memset(dp1,0x3f,sizeof(dp1));
for(int i=1;i<=n;++i) dp1[i][i]=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(dp[i][j]<=x) dp1[i][j]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(i!=j)
for(int k=1;k<=n;++k)
if(i!=k&&j!=k) dp1[j][k]=min(dp1[j][k],dp1[j][i]+dp1[i][k]);
for(int i=1;i<=n;++i)
if(dp1[1][i]>k) return 0;
return 1;
}
signed main()
{
freopen("portal.in","r",stdin);
freopen("portal.out","w",stdout);
cin>>n>>m>>k;
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;++i) dp[i][i]=0;
for(int i=1;i<=m;++i)
{
int x,y,dist;
cin>>x>>y>>dist;
dp[x][y]=dist;
dp[y][x]=dist;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(i!=j)
for(int k=1;k<=n;++k)
if(i!=k&&j!=k) dp[j][k]=min(dp[j][k],dp[j][i]+dp[i][k]);
while(l<r)
{
int mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<r;
return 0;
}
有人吗
有
但我不会
已解决。
题目理解有误,是两两之间可到。