首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

HDU 2717 BFS:三種操作最短路

     編輯:C++ 入門

題目

從整數 a 變到 b,允許操作:+1, -1, *2。求最少步數。a, b ≤ 200000。

關鍵優化

  • a == b:答案 0。
  • a > b:只能 -1,答案 a-b。
  • a < b:BFS。狀態空間限制在 [0, 2*b],因為超過 2*b 後再 *2 再 -1 絕不優於直接 -1。

BFS 代碼

const int MAXN = 200000;
int q[MAXN], dist[MAXN];
bool vis[MAXN];

while (cin >> n >> k) {
    if (n == k) { cout << 0 << '\n'; continue; }
    if (n > k) { cout << n-k << '\n'; continue; }
    memset(vis, 0, sizeof(vis));
    int head=0, tail=0;
    q[tail++] = n; vis[n]=1; dist[n]=0;
    while (head < tail && !vis[k]) {
        int u = q[head++];
        int v;
        v = u+1; if (v<=2*k && !vis[v]) { vis[v]=1; dist[v]=dist[u]+1; q[tail++]=v; }
        v = u-1; if (v>=0 && !vis[v]) { vis[v]=1; dist[v]=dist[u]+1; q[tail++]=v; }
        v = u*2; if (v<=2*k && !vis[v]) { vis[v]=1; dist[v]=dist[u]+1; q[tail++]=v; }
    }
    cout << dist[k] << '\n';
}

複雜度

狀態數 ≤ 2*k,邊數 ≤ 3×狀態數,O(k) 時間空間,k ≤ 100000 極快。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved