一件神奇的事情
查看原帖
一件神奇的事情
1033922
lyas145楼主2024/6/21 10:19

我跑一遍 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;
}
2024/6/21 10:19
加载中...