比赛 |
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;
}