BFS优先队列优化 95分求调
查看原帖
BFS优先队列优化 95分求调
1405239
lbh123楼主2025/1/19 08:19

rt

#include<bits/stdc++.h>
using namespace std;
int mp[110][110],vis[110][110],a[110][110];
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};
int n,m,hh,tt;
struct node{
    int x,y,co,fl,w;
    bool operator <(const node &W)const{
    	return w>W.w;
    }
};
priority_queue<node>q;
void bfs(int sx,int sy,int c){
    q.push({sx,sy,c,0,0});
    vis[sx][sy]=1;
    while(!q.empty()){
        int x=q.top().x,y=q.top().y,cc=q.top().co,f=q.top().fl,w=q.top().w;
        q.pop();
        for(int i=1;i<=4;i++){
            int xx=x+dx[i],yy=y+dy[i];
            if(xx<=n&&xx>0&&yy<=n&&yy>0&&!vis[xx][yy]){
                if(mp[xx][yy]==-1){//走到的点无色 
                    if(!f){
                        if(cc==1){
                            a[xx][yy]=min(a[xx][yy],w+2);
                            q.push({xx,yy,1,1,a[xx][yy]});
                        }else{
                            a[xx][yy]=min(a[xx][yy],w+2);
                            q.push({xx,yy,0,1,a[xx][yy]});
                        }
                        vis[xx][yy]=1;
                    }else{
                        vis[xx][yy]=1;
                    }
                }else{
                    if(mp[xx][yy]!=cc){
                        a[xx][yy]=min(a[xx][yy],w+1);
                        q.push({xx,yy,mp[xx][yy],0,a[xx][yy]});
                        vis[xx][yy]=1;
                    }else{
                        a[xx][yy]=min(a[xx][yy],w);
                        q.push({xx,yy,mp[xx][yy],0,a[xx][yy]});
                        vis[xx][yy]=1;
                    }
                }
            }
        }
    }
}
int main(){
    cin>>n>>m;
    memset(mp,-1,sizeof mp);
    memset(a,0x3f3f3f,sizeof a);
    for(int i=1;i<=m;i++){
        int x,y,c;
        cin>>x>>y>>c;
        mp[x][y]=c;
    }
    a[1][1]=0;
    bfs(1,1,mp[1][1]);
    if(a[n][n]>0x3f3f00){
        cout<<-1;
        return 0;
    }
    cout<<a[n][n]<<"\n";
    return 0;
}
2025/1/19 08:19
加载中...