求刚刚比赛 C 优化空间
  • 板块学术版
  • 楼主lzyqwq
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/2/11 19:16
  • 上次更新2023/10/24 01:05:41
查看原帖
求刚刚比赛 C 优化空间
539211
lzyqwq楼主2023/2/11 19:16

rt,思路建虚点+最短路,时间复杂度 O(nm)\mathcal{O}(nm),但是空间被卡了

#include<bits/stdc++.h>
#define N 3005
using namespace std;
int n,m,k,a[N][N],h[N*N],dis[N*N<<1],tot,dx[]={1,-1,0,0},dy[]={0,0,1,-1};
deque<int>q;
struct edge{
    int v,w;
};
vector<edge>g[N*N<<1];
int id(int x,int y){
    return (x-1)*m+y;
}
int main(){
    memset(dis,-1,sizeof dis);
    scanf("%d%d%d",&n,&m,&k);
    tot=n*m;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=1,x,y;i<=k;++i){
        scanf("%d%d",&x,&y);
        if(!h[a[x][y]]){
            g[h[a[x][y]]=++tot].push_back({0,1});
            g[0].push_back({tot,0});
        }
        g[id(x,y)].push_back({h[a[x][y]],1});
        g[h[a[x][y]]].push_back({id(x,y),0});
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            if(a[i][j]){
                for(int l=0;l<4;++l){
                    int u=i+dx[l],v=j+dy[l];
                    if(u&&u<=n&&v&&v<=m&&a[u][v]){
                        g[id(i,j)].push_back({id(u,v),1});
                    }
                }
            }
        }
    }
    dis[1]=0;
    q.push_back(1);
    while(q.size()){
        int u=q.front();
        q.pop_front();
        for(auto[v,w]:g[u]){
            if(~dis[v]){
                continue;
            }
            dis[v]=dis[u]+w;
            if(w){
                q.push_back(v);
            }else{
                q.push_front(v);
            }
        }
    }
    printf("%d\n",dis[id(n,m)]);
}
2023/2/11 19:16
加载中...