蒟蒻CE求助
查看原帖
蒟蒻CE求助
358781
wublabdubdub_s楼主2021/10/12 19:12
#include<iostream>
#include<utility>
#include<cstdio>
#include<queue>
using namespace std;

long long n,m,a,b,c,anss=2147483647;
long long mp[1002][1002];
long long ans[1002][1002];
long long dis[1002][1002];
bool vis[1002][1002];
struct node
{
	long long x,y,w;
	bool operator<(const node &b)
	{
		return w>b.w;
	}
};
priority_queue<node> q;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};

node make_node(int _x,int _y,int _w)
{
	node a;
	a.x=_x;a.y=_y;a.w=_w;
	return a;
}

void dij(int x,int y)
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			dis[i][j]=2147483647;
			vis[i][j]=0;
		}
	}
	q.push(make_node(x,y,0));
	while(!q.empty())
	{
		node now=q.top();q.pop();
		int nx=now.x,ny=now.y,nw=now.w;
		if(vis[nx][ny]) continue;
		vis[nx][ny]=1;dis[nx][ny]=nw;
		for(int i=0;i<4;i++)
		{
			int tx=nx+dx[i];
			int ty=ny+dy[i];
			if(tx<1||ty<1||tx>n||ty>m) continue;
			if(!vis[tx][ty]) q.push(make_node(tx,ty,nw+mp[tx][ty]));
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			ans[i][j]+=dis[i][j];
		}
	}
}

int main()
{
	scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&mp[i][j]);
		}
	}
	
	dij(1,a);
	dij(n,b);
	dij(n,c);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	anss=min(anss,ans[i][j]-2*mp[i][j]);
	
	cout<<anss+mp[1][a]+mp[n][b]+mp[n][c];
	return 0;
}

rt,报错报到头文件里了。。。看不懂

2021/10/12 19:12
加载中...