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

POJ 3169 Layout 差分約束系統 SPFA 解法

     編輯:C++ 入門

約束轉換

  • 最大距離 A B D:x_B - x_A ≤ D → 邊 A→B (D)
  • 最小距離 A B D:x_A - x_B ≤ -D → 邊 B→A (-D)
  • 順序約束隱含:x_{i+1} - x_i ≥ 0 → i+1→i (0)

SPFA 求最短路

void spfa() {
    fill(dis, dis+n+1, INF); dis[1] = 0;
    queue q; q.push(1); inq[1] = 1;
    while (!q.empty()) {
        int u = q.front(); q.pop(); inq[u] = 0;
        for (int i=head[u]; ~i; i=e[i].next) {
            int v = e[i].v;
            if (dis[v] > dis[u] + e[i].w) {
                dis[v] = dis[u] + e[i].w;
                if (!inq[v]) {
                    if (++cnt[v] > n) { has_cycle = true; return; }
                    inq[v] = 1; q.push(v);
                }
            }
        }
    }
}

結果判斷

  • has_cycle → -1(矛盾)
  • dis[n] == INF → -2(無上界)
  • 否則 → dis[n]
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved