我又来求助P6833啦
  • 板块灌水区
  • 楼主星空舞涵
  • 当前回复8
  • 已保存回复8
  • 发布时间2020/9/22 09:10
  • 上次更新2023/11/5 12:48:33
查看原帖
我又来求助P6833啦
243750
星空舞涵楼主2020/9/22 09:10

在经过57遍的不懈提交后,我从20分变成30分了,只有#6和#9两个点错了。

那位带佬能帮忙看看嘛。

嘤嘤嘤

#include<bits/stdc++.h>
using namespace std;
unsigned long long dis[1001*1001+1],cnt,minn,ans[1001*1001+1];
int aa[1001][1001],n,m,a,b,c,head[1010*1010+1],l[1001*1001+1];
struct cxk{
	long long to,zhi,next;
}e[4001*2001+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,62)-1;
	minn=minn*2;
	cin>>n>>m>>a>>b>>c;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>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!=m)add((i-1)*m+j,(i-1)*m+j+1,aa[i][j+1]);
		}
	memset(dis,0x7f,sizeof(dis));
	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];	
	memset(dis,0x7f,sizeof(dis));
	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];
			
	memset(dis,0x7f,sizeof(dis));
	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];
			ans[(i-1)*m+j]=ans[(i-1)*m+j]-2*aa[i][j];
			minn=min(minn,ans[(i-1)*m+j]);
		}
	cout<<minn;		
}
2020/9/22 09:10
加载中...