WA两个点,30分
查看原帖
WA两个点,30分
559602
ganjihao楼主2023/9/30 15:05

WA两个点,30分

#include<iostream>
#include<cstdio>
#include<queue>
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;

typedef long long ll;
const int N=1010;
ll dis[3][N][N],g[N][N],vis[N][N];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct node
{
    int x,y,stp;
    bool operator < (const node &x)const
    {
        return this->stp>x.stp;
    }
};
priority_queue<node>q;
int n,m,a,b,c;

void bfs(int ind,int sx,int sy)
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			vis[i][j]=0,dis[ind][i][j]=inf;
    while(q.size())q.pop();
    q.push((node){sx,sy,0});
    int x,y,stp;
    while(q.size())
    {
        x=q.top().x,y=q.top().y,stp=q.top().stp;
        q.pop();
        if(vis[x][y]||x<1||y<1||x>n||y>m)continue;
        vis[x][y]=1;
        dis[ind][x][y]=min(dis[ind][x][y],g[x][y]+stp);
        for(int i=0;i<4;i++)
            q.push((node){x+dir[i][0],y+dir[i][1],dis[ind][x][y]});
    }
}

int main()
{
    scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
    for(int i=n;i;i--)
        for(int j=1;j<=m;j++)
            scanf("%lld",&g[i][j]);
    bfs(0,n,a);
    bfs(1,1,b);
    bfs(2,1,c);
	ll ans=inf;
	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]-2*g[i][j]);
	printf("%lld",ans);
    return 0;
}/*
5 5 1 2 4
1 8 1 6 6
1 1 1 2 4
8 3 1 2 2
1 2 1 9 1
1 0 9 1 1

*/

求大佬帮忙

2023/9/30 15:05
加载中...