2026/4/8 21:44:00
网站建设
项目流程
网络建站的费用,提供信息门户网站搭建,南宁网站建设制作,做医院的网站 配色怎么选择【双端队列bfs】
笔记而已 推荐好文 推荐视频 双端队列bfs是解决0-1bfs最常用的一种手段 0-1bfs就是边值只有0或1两种情况时用的bfs 一般是求起点到终点所用边值总值最小为多少 用例题更好说明 1.拖拉机 这里#xff0c;在通过没有干草块的位置时所用边值为零 通过有干草块位…【双端队列bfs】笔记而已推荐好文推荐视频双端队列bfs是解决0-1bfs最常用的一种手段0-1bfs就是边值只有0或1两种情况时用的bfs一般是求起点到终点所用边值总值最小为多少用例题更好说明1.拖拉机这里在通过没有干草块的位置时所用边值为零通过有干草块位置时边值为1要求需要移除最少的数量那么一定是能不移就不移最好实在需要移再移换句话说就是优先走没有干草块的位置当走完没有干草块的位置时再走有干草块的位置此时可以用双端队列deque来实现将没有干草块的压入队头有干草块的压入队尾每次只用队头元素就能实现先走边值为0再走边值为1不同于朴素bfs0-1bfs不需要判重数组一个点可能多次经过但是只有在值更小时才需要更新代码#includebits/stdc.h//#define int long longusingnamespacestd;boolg[1015][1015];intdx[]{1,-1,0,0};intdy[]{0,0,1,-1};intdis[1015][1015];structnode{intx,y;};dequenodedq;intn,x,y;voidbfs(intx,inty){dq.push_front((node){x,y});while(dq.size()){intaxdq.front().x,aydq.front().y;dq.pop_front();for(inti0;i4;i){intsxaxdx[i],syaydy[i];if(sx0sx1010sy0sy1010){if(dis[sx][sy]dis[ax][ay]g[sx][sy])continue;//只有值更小时才需要更新if(!g[sx][sy])dq.push_front((node){sx,sy}),dis[sx][sy]dis[ax][ay];if(g[sx][sy])dq.push_back((node){sx,sy}),dis[sx][sy]dis[ax][ay]1;if(!sx!sy)return;}}}}voidsolve(){cinnxy;while(n--){inta,b;cinab;g[a][b]1;}memset(dis,1e6,sizeof(dis));dis[x][y]0;bfs(x,y);coutdis[0][0]endl;}signedmain(){intt1;//cint;while(t--){solve();}return0;}