日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Frog Traveler 最短路,bfs剪枝,打印路径

發布時間:2025/3/19 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Frog Traveler 最短路,bfs剪枝,打印路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


題意 :

  • 給兩個長度為n的數組,初始位于索引n,目標是越過索引1,注意不能往后跳,每次可以跳0到a[i]a[i]a[i]米,即,身處索引iii,可以跳[0,a[i]][0, a[i]][0,a[i]]中的任意米,但是從i跳到j,會后退b[j]步,問最少多少步可以跳出,n<=3e5n<=3e5n<=3e5,并打印每次跳后到達地方的位置坐標(下滑前)

思路 :

  • 從n開始bfs,每次將跳到且下滑后的點入隊,維護到達這個點的最小步數
  • 優化剪枝是維護之前能到的最高(數值最小)的位置,枚舉當前點能到達的點,如果低于等于最高位置,說明后面跳的更少的方案都可以被剪枝了(因為對于同一個點下滑的距離是確定的,只是跳的距離可以選擇),break;并用當前點能到的最高的點維護最高位置
  • 打印路徑,由于是輸出下滑前的點,而我們入隊用的是下滑后的點,所以再開一個ans數組映射
  • 打印路徑的具體方案 :從終點開始,將點放入棧中,點變為其前驅,直到沒有前驅(即前驅為-1),然后再依次取出棧頂即可
#include <iostream> #include <algorithm> #include <cstring> #include <queue> #include <stack>using namespace std;const int N = 3e5 + 10;int n, mi; int a[N], b[N]; int pre[N], dist[N], ans[N];int bfs() {mi = n;queue<int> q;memset(dist, 0x3f, sizeof dist);memset(pre, -1, sizeof pre);memset(ans, 0, sizeof ans);dist[n] = 0;q.push(n);while (q.size()){int t = q.front(); q.pop();if (t == 0) return dist[t];for (int i = a[t]; i > 0; i -- ){int now = t - i; // 下滑前int temp;if (now >= mi) break;if (now <= 0) temp = 0, now = 0;else temp = now, now = now + b[t - i]; // temp是下滑前,now是下滑后if (dist[now] > dist[t] + 1){dist[now] = dist[t] + 1;pre[now] = t;ans[now] = temp; // 映射q.push(now);}}mi = min(mi, t - a[t]);}return -1; }int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _ = 1; // cin >> _;while (_ -- ){cin >> n;for (int i = 1; i <= n; i ++ ) cin >> a[i];for (int i = 1; i <= n; i ++ ) cin >> b[i];cout << bfs() << endl;// 打印路徑 倒序輸出stack<int> stk;int x = 0;while (pre[x] != -1){stk.push(x);x = pre[x];}while (!stk.empty()){int now = stk.top(); stk.pop();cout << ans[now] << ' ';}cout << endl;}return 0; }

總結

以上是生活随笔為你收集整理的Frog Traveler 最短路,bfs剪枝,打印路径的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。