关于dij的vis优化
查看原帖
关于dij的vis优化
178992
Hanghang楼主2022/11/24 20:59

我写了一个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; 
	}
}
2022/11/24 20:59
加载中...