求问手写堆与STL的区别
查看原帖
求问手写堆与STL的区别
705343
cbkxx楼主2024/1/5 21:36
#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
};
struct n2{
	int x,y;
	long long ro;
	bool operator <(const n2 &b)const{
		return ro>b.ro;
	}
};
int n,m,a,b,c,f[1005][1005],top;
long long dis[3][1005][1005],ans=1e18;
bool vis[1005][1005];
vector<node>g[1005][1005]; 
void dij(int k,int sx,int sy){
	priority_queue<n2> heap;
	dis[k][sx][sy]=f[sx][sy];
	memset(vis,0,sizeof(vis));
	vis[sx][sy]=1;
	int dx=sx,dy=sy;
	heap.push({dx,dy,f[sx][sy]});
	for(int i=1;i<n*m;i++){
		for(int j=0,px,py;j<g[dx][dy].size();j++){
			px=g[dx][dy][j].x,py=g[dx][dy][j].y;
			if(dis[k][px][py]>dis[k][dx][dy]+f[px][py]){
				dis[k][px][py]=dis[k][dx][dy]+f[px][py];
				heap.push({px,py,dis[k][px][py]});
			}
		}
		dx=heap.top().x;
		dy=heap.top().y;
		heap.pop();
		vis[dx][dy]=1;
	}
}
int main(){
	memset(dis,0x3f,sizeof(dis)); 
	cin>>n>>m>>a>>b>>c;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>f[i][j];
			if(i!=1)g[i][j].push_back({i-1,j});
			if(i!=n)g[i][j].push_back({i+1,j});
			if(j!=1)g[i][j].push_back({i,j-1});
			if(j!=m)g[i][j].push_back({i,j+1});
		} 
	}
	dij(0,1,a);
	dij(1,n,b);
	dij(2,n,c);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ans=min(ans,dis[0][i][j]+dis[1][i][j]+dis[2][i][j]-f[i][j]*2);
		}
	}
	cout<<ans;
	return 0;
}

this

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
};
struct n2{
	int x,y;
	long long ro;
}heap[4000005];
int n,m,a,b,c,f[1005][1005],top;
long long dis[3][1005][1005],ans=1e18;
bool vis[1005][1005];
vector<node>g[1005][1005]; 
void Hinsert(n2 x){
	heap[++top]=x;
	int k=top;
	while(k!=1){
		if(heap[k].ro<heap[k/2].ro)swap(heap[k],heap[k/2]);
		else break;
		k/=2;
	}
}
void Herase(){
	swap(heap[1],heap[top]);
	heap[top].x=heap[top].y=heap[top].ro=0x3f3f3f3f;
	top--;
	int k=1;
	while(heap[k].ro>heap[k*2].ro||heap[k].ro>heap[k*2+1].ro){
		if(heap[k*2].ro<heap[k*2+1].ro){
			swap(heap[k],heap[k*2]);
			k*=2;
		}else{
			swap(heap[k],heap[k*2+1]);
			k=k*2+1;
		}
	}
}
void dij(int k,int sx,int sy){
	for(int i=0;i<=4000000;i++)heap[i].x=heap[i].y=heap[i].ro=0x3f3f3f3f3f3f3f;
	dis[k][sx][sy]=f[sx][sy];
	memset(vis,0,sizeof(vis));
	vis[sx][sy]=1;
	int dx=sx,dy=sy;
	Hinsert({dx,dy,f[sx][sy]});
	for(int i=1;i<n*m;i++){
		for(int j=0,px,py;j<g[dx][dy].size();j++){
			px=g[dx][dy][j].x,py=g[dx][dy][j].y;
			if(dis[k][px][py]>dis[k][dx][dy]+f[px][py]){
				dis[k][px][py]=dis[k][dx][dy]+f[px][py];
				Hinsert({px,py,dis[k][px][py]});
			}
		}
		dx=heap[1].x;
		dy=heap[1].y;
		Herase();
		vis[dx][dy]=1;
		
	}
}
int main(){
	memset(dis,0x3f,sizeof(dis)); 
	cin>>n>>m>>a>>b>>c;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>f[i][j];
			if(i!=1)g[i][j].push_back({i-1,j});
			if(i!=n)g[i][j].push_back({i+1,j});
			if(j!=1)g[i][j].push_back({i,j-1});
			if(j!=m)g[i][j].push_back({i,j+1});
		} 
	}
	dij(0,1,a);
	dij(1,n,b);
	dij(2,n,c);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ans=min(ans,dis[0][i][j]+dis[1][i][j]+dis[2][i][j]-f[i][j]*2);
		}
	}
	cout<<ans;
	return 0;
}

this

求助 手打堆MLE+RE STLAC Why?

2024/1/5 21:36
加载中...