还是P6833雷雨
  • 板块灌水区
  • 楼主星空舞涵
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/9/21 16:06
  • 上次更新2023/11/5 12:50:30
查看原帖
还是P6833雷雨
243750
星空舞涵楼主2020/9/21 16:06

在上午两位大佬的指引下,我用Dij写了一遍,但还是20分,我已经交了42遍了

#include<bits/stdc++.h>
using namespace std;
unsigned long long  dis[1000*1000+1],cnt,minn,ans[1000*1000+1];
int aa[1000][1001],n,m,a,b,c,head[1000*1000+1],l[1000*1000+1];
struct cxk{
	long long to,zhi,next;
}e[4000*1000+1];
void add(int p,int y,int z){
	cnt++;
	e[cnt].to=y;
	e[cnt].zhi=z;
	e[cnt].next=head[p];
	head[p]=cnt; 
}
struct node{
	int zhi;int xv;
	bool operator <(const node &u)const{
		return u.zhi<zhi;	
	} 
};
priority_queue<node>q;
int main()
{
	minn=pow(2,64)-1;
	cin>>n>>m>>a>>b>>c;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>aa[i][j];
			ans[(i-1)*m+j]=-2*aa[i][j];
		}
			
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			if(i!=1)add((i-1)*m+j,(i-2)*m+j,aa[i-1][j]);
			if(i!=n)add((i-1)*m+j,i*m+j,aa[i+1][j]);
			if(j!=1)add((i-1)*m+j,(i-1)*m+j-1,aa[i][j-1]);
			if(j!=n)add((i-1)*m+j,(i-1)*m+j+1,aa[i][j+1]);
			dis[(i-1)*m+j]=pow(2,64)-1;
		}
	
	node x;
	x.zhi=aa[1][a];
	x.xv=a;
	q.push(x);
	dis[a]=aa[1][a];
	while(!q.empty())
	{
		node x=q.top();
		q.pop();
		int y=x.xv;
		long long  z=x.zhi;
		if(l[y]==1)continue;
		else l[y]=1;
		for(int i=head[y];i;i=e[i].next)
		{
			int too=e[i].to;
			if(l[too]==1)continue;
			if(z+e[i].zhi<dis[too])
			{
				dis[too]=z+e[i].zhi;
				node o;
				o.zhi=dis[too];
				o.xv=e[i].to;
				q.push(o);
			}
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			ans[(i-1)*m+j]=ans[(i-1)*m+j]+dis[(i-1)*m+j];
			dis[(i-1)*m+j]=pow(2,64)-1;
		}
			
	memset(l,0,sizeof(l));
	x.zhi=aa[n][b];
	x.xv=(n-1)*m+b;
	q.push(x);
	dis[(n-1)*m+b]=aa[n][b];
	while(!q.empty())
	{
		node x=q.top();
		q.pop();
		int y=x.xv;
		long long  z=x.zhi;
		if(l[y]==1)continue;
		else l[y]=1;
		for(int i=head[y];i;i=e[i].next)
		{
			int too=e[i].to;
			if(l[too]==1)continue;
			if(z+e[i].zhi<dis[too])
			{
				dis[too]=z+e[i].zhi;
				node o;
				o.zhi=dis[too];
				o.xv=e[i].to;
				q.push(o);
			}
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			ans[(i-1)*m+j]=ans[(i-1)*m+j]+dis[(i-1)*m+j];
			dis[(i-1)*m+j]=pow(2,64)-1;
		}
			
	memset(l,0,sizeof(l));
	x.zhi=aa[n][c];
	x.xv=(n-1)*m+c;
	q.push(x);
	dis[(n-1)*m+c]=aa[n][c];
	while(!q.empty())
	{
		node x=q.top();
		q.pop();
		int y=x.xv;
		long long  z=x.zhi;
		if(l[y]==1)continue;
		else l[y]=1;
		for(int i=head[y];i;i=e[i].next)
		{
			int too=e[i].to;
			if(l[too]==1)continue;
			if(z+e[i].zhi<dis[too])
			{
				dis[too]=z+e[i].zhi;
				node o;
				o.zhi=dis[too];
				o.xv=e[i].to;
				q.push(o);
			}
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			ans[(i-1)*m+j]=ans[(i-1)*m+j]+dis[(i-1)*m+j];
			minn=min(minn,ans[(i-1)*m+j]);
		}
	cout<<minn;		
}
2020/9/21 16:06
加载中...