我写了一个n^2log的暴力dij,但是我加上vis数组优化就要寄,不加就没问题,求大佬看看什么问题,万分感谢。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+3,M=2003;
ll n,T,k,a[N],dis[M][M],f[M][M],q[N];
vector<int>ve[N];
vector<pair<int,int> >cnt[N];
bool v[N],vis[N];
void B(ll w)
{
for(int i=1;i<=n;i++)v[i]=0;
int h=0,t=1;q[1]=w;dis[w][w]=0;
while(h<t)
{
int x=q[++h];
for(int i=0;i<ve[x].size();i++)
{
int y=ve[x][i];
if(v[y]==1)continue;
v[y]=1;q[++t]=y;
dis[w][y]=dis[w][x]+1;
}
}
}
priority_queue<pair<int,int> >Q;
void D(ll w)
{
for(int i=1;i<=n;i++)vis[i]=0;
Q.push({0,w});f[w][w]=0;
while(!Q.empty())
{
ll x=Q.top().second;Q.pop();
//if(vis[x]==1)continue;
//vis[x]=1;
for(int i=0;i<cnt[x].size();i++)
{
int y=cnt[x][i].first,z=cnt[x][i].second;
if(f[w][x]+z<f[w][y])
{
f[w][y]=f[w][x]+z;
Q.push({-f[w][y],y});
}
}
}
}
int main()
{
cin>>n>>T>>k;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++)
{
int x,y;cin>>x>>y;
ve[x].push_back(y);
ve[y].push_back(x);
}
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=f[i][j]=(ll)1e18;
for(int i=1;i<=n;i++)B(i);
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
if(i!=j&&dis[i][j]<=k)cnt[i].push_back({j,a[j]});
for(int i=1;i<=n;i++)D(i);
while(T--)
{
int x,y;cin>>x>>y;
cout<<f[x][y]+a[x]<<endl;
}
}