\[ dp[u][v]=Min(Max(dp[u][k],dp[k][v])) \]
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 301
using namespace std;
int n,m,t;
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int dp[maxn][maxn];
inline void Floyd(){
for(register int k=1;k<=n;k++){
for(register int i=1;i<=n;i++){
for(register int j=1;j<=n;j++) if(i!=j&&dp[i][j]>max(dp[i][k],dp[k][j])){
dp[i][j]=max(dp[i][k],dp[k][j]);
}
}
}
}
int main(){
memset(dp,0x3f3f3f3f,sizeof dp);
n=read(),m=read(),t=read();
for(register int i=1;i<=m;i++){
int u=read(),v=read();
dp[u][v]=read();
}
for(register int i=1;i<=n;i++) dp[i][i]=0;
Floyd();
for(register int i=1;i<=t;i++){
int u=read(),v=read();
printf("%d\n",dp[u][v]==0x3f3f3f3f?-1:dp[u][v]);
}
return 0;
}
原文:https://www.cnblogs.com/akura/p/11066845.html