当一张图的边权只有 \(0\) 和 \(1\) 时,跑 dij 的堆优化显得比较累赘。因为只有两个取值,所以取 \(0\) 的时候在队列前面推进来,反之在后面。其他和 dij 没什么区别,时间复杂度 \(O(m)\),其中 \(m\) 是边数。
相关题目:P4554 小明的游戏。
点击查看代码
void work() {
m0(vis); mem(dis,0x3f);
For(i,0,n-1) For(j,0,m-1) cin>>ch[i][j];
cin>>stx>>sty>>edx>>edy; dis[stx][sty]=0;
deque<node>q; while(!q.empty()) q.pop_front();
q.push_front({stx,sty});
while(!q.empty()) {
auto [x,y]=q.front(); q.pop_front();
// cout<<x<<' '<<y<<'\n';
if(vis[x][y]) continue;
vis[x][y]=1;
For(i,1,4) {
int X=x+dx[i],Y=y+dy[i];
if(X>=n||X<0||Y>=m||Y<0) continue;
int val=(ch[x][y]!=ch[X][Y]);
if(dis[x][y]+val>=dis[X][Y]) continue;
dis[X][Y]=dis[x][y]+val;
if(ch[x][y]==ch[X][Y]) {
q.push_front({X,Y});
} else {
q.push_back({X,Y});
}
}
}
cout<<dis[edx][edy]<<'\n';
}