我跑一遍 Floyd 得 30分。
我跑两边 Floyd 得 80分。
我跑三遍 Floyd 就 AC 了。
这是为什么?
求大佬解答。
这是 AC 代码。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=255,M=2e4+5;
int n,m,q;
int c[N],dis[N][N],mx[N][N];
void Floyd() {
for (int k=1;k<=n;k++) {
for (int i=1;i<=n;i++) {
for (int j=1;j<=n;j++) {
if (dis[i][j]+mx[i][j]>dis[i][k]+dis[k][j]+max(mx[i][k],mx[k][j])) {
dis[i][j]=dis[i][k]+dis[k][j];
mx[i][j]=max(mx[i][k],mx[k][j]);
}
}
}
}
}
int main() {
scanf("%d%d%d",&n,&m,&q);
memset(dis,0x3f,sizeof dis);
for (int i=1;i<=n;i++) {
scanf("%d",&c[i]);
dis[i][i]=0;
}
for (int i=1;i<=m;i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
dis[u][v]=dis[v][u]=min(dis[u][v],w);
mx[u][v]=mx[v][u]=max(c[u],c[v]);
}
Floyd();Floyd();Floyd();
while (q--) {
int s,t;
scanf("%d%d",&s,&t);
printf("%d\n",dis[s][t]+mx[s][t]);
}
return 0;
}