#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
#define maxn 200001
#define int long long
struct edge{
int v,w;
};
struct node{
int dis,u;
bool operator > (const node &a)const{
return dis > a.dis;
}
};
vector<edge> e[maxn];
int dis[maxn],vis[maxn],sc[maxn];
priority_queue<node,vector<node>,greater<node> > q;
void dijkstra(int s){
dis[s]=0;
q.push({0,s});
while(!q.empty()){
int u=q.top().u;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=0;i<e[u].size();i++){
edge ed=e[u][i];
int v=ed.v,w=ed.w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push({dis[v],v});
}
}
}
}
int n,Q,k;
signed main(){
cin>>n>>Q>>k;
for(int i=1;i<=n;i++){
cin>>sc[i];
}
for(int i=1,x,y;i<n;i++){
cin>>x>>y;
e[x].push_back({y,sc[y]});
e[y].push_back({x,sc[x]});
}
while(Q--){
int x,y;
cin>>x>>y;
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
dijkstra(x);
cout<<dis[y]<<'\n';
}
return 0;
}
我没看错吧,这就是求最短路啊,我就想用Dij求一下看看答案,怎么就不对了呢???难道只能用LCA,我们忽略超时的情况,就说Dijkstra能不能解吧,肯定能解的呀,怎么输出是错的呢???