差動制約 - 51Nod 1366(不平等)、2019年10月25日T2

フェイス質問

51Nod 1366

ソリューション

これは最長経路に対して得られる最大の長さにフロイドのアルゴリズムによって構築された問題図の意味に応じて、単純な差分制約問題である.. \(| X-Y |が\ leqslant D \) に展開
\ [\ {始まりますleqslant \ XY}ケース| D | \\ YX \ leqslant | D | \ケース終了{} \]
単に隣接行列を押すより少ない負の正の数の両方が、図が構築ことに留意すべきで実現特に図を構築することができるのでしたがって、使用(0 \)\を右リングからすべての側面を覆うように、この問題は、サンプル解決に反映させることができません。

合計時間複雑度\(O(3)\ ^ TN) 空間複雑\(O(^ N-2)\)

プログラム

#include <iostream>
#include <cstring>
using namespace std;

#define MAXN 52
#define INF 0x3f3f3f3f
int T, N, D, d[MAXN][MAXN];

void floyd() {
    for (int k = 0; k < N; k++)
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                if (d[i][k] + d[k][j] < d[i][j] && d[i][k] < INF && d[k][j] < INF)
                    d[i][j] = d[i][k] + d[k][j];
}

int main() {
    cin >> T;
    while (T--) {
        cin >> N >> D;
        for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++) {
            char c;
            cin >> c;
            d[i][j] = c == 'Y' ? D : INF;
        }
        for (int i = 0; i < N; i++)
            d[i][i] = 0;
        floyd();

        int mind = -INF;
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                mind = max(mind, d[i][j]);
        if (mind >= INF)
            cout << -1 << endl;
        else
            cout << mind << endl;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/lrw04/p/11795060.html