比赛 CSP2023-S模拟赛 评测结果 AAAAAAEEEEEEEEEEEEEE
题目名称 坡伊踹 最终得分 30
用户昵称 PCT 运行时间 5.267 s
代码语言 C++ 内存使用 197.16 MiB
提交时间 2023-10-17 18:23:14
显示代码纯文本
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N=5e3+5;
int n,q,u,v,w;
long long a[N];
struct Edge{
	int to,value;
};
vector<Edge>G[N];
long long dis[N][N],minn;
bool in[N];
int main(){
	freopen("poitry.in","r",stdin);
	freopen("poitry.out","w",stdout);
	cin.tie(0)->sync_with_stdio(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	memset(dis,9,sizeof(dis));
	for(int i=1;i<n;i++){
		cin>>u>>v>>w;
		G[u].push_back({v,w});
		G[v].push_back({u,w});
		dis[u][v]=dis[v][u]=w;
	}
	for(int i=1;i<=n;i++){
		dis[i][i]=0;
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
	while(q--){
		cin>>u>>v;
		memset(in,0,sizeof(in));
		minn=1e18;
		for(int i=1;i<=n;i++){
			if(dis[u][i]+dis[i][v]==dis[u][v]){
				in[i]=1;
			}
		}
		for(int i=1;i<=n;i++){
			if(in[i]){
				minn=min(minn,max(a[i],dis[i][u]));
			} 
		}
		cout<<minn<<"\n";
	}
return 0; 
}