比赛 CSP2023-S模拟赛 评测结果 AAAAAAEEEEEEEEEEEEEE
题目名称 坡伊踹 最终得分 30
用户昵称 mhh 运行时间 2.893 s
代码语言 C++ 内存使用 9.55 MiB
提交时间 2023-10-17 19:13:17
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=100010; 
int n,q,dis[N],ver[2*N],idx,val[2*N],nxt[2*N],hd[N],vis[N],ans,a[N],u,v,w,minn=0x3f3f3f3f;
void add(int a,int b,int c){
	ver[++idx]=b;
	val[idx]=c;
	nxt[idx]=hd[a];
	hd[a]=idx;
}
bool f=1,f1=1;
void dfs(int p,int fa,int sum,int tot){
	if(p==v&&minn>=sum){
		minn=sum;
		ans=tot;
		return;
	}
	for(int i=hd[p];i;i=nxt[i]){
		if(ver[i]!=fa&&!vis[ver[i]]){
			vis[ver[i]]=1;
			dfs(ver[i],p,sum+val[i],min(max(sum+val[i],a[ver[i]]),tot));
			vis[ver[i]]=0;
		}
	}
}
int main(){
	freopen("poitry.in","r",stdin);
	freopen("poitry.out","w",stdout);
	memset(dis,0x3f,sizeof(dis));
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<n;i++){
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w),add(v,u,w);
		dis[v]=w;
		if(u!=1) f=0;
		if(u+1!=v) f1=0;
	}
	if(f){
		dis[1]=0;
		for(int i=1;i<=q;i++){
			scanf("%d%d",&u,&v);
			printf("%d\n",min(max(a[u],dis[u]+dis[v]),min(max(a[1],dis[v]),a[v]))); 
		}
	}
	else if(f1){
		for(int i=1;i<=q;i++){
			scanf("%d%d",&u,&v);
			for(int j=hd[i];j;j=nxt[j]){
				dfs(ver[j],0,0,a[u]);
			}
			printf("%d\n",ans);	
		}
	}
	else{
		for(int i=1;i<=q;i++){
			memset(vis,0,sizeof(vis));
			scanf("%d%d",&u,&v);
			ans=0,minn=0x3f3f3f3f;
			dfs(u,0,0,a[u]);
			printf("%d\n",ans);
		}
	}
	return 0;
}