差分约束 - 51Nod 1366(贫富差距), 2019.10.25 T2

题面

51Nod 1366

这是一个简单的差分约束问题. 依题意建图, 用 Floyd 算法求出最长路长度的最大值即可. 对于 \(|x-y|\leqslant d\), 可展开为
\[ \begin{cases} x-y\leqslant|d|\\ y-x\leqslant|d| \end{cases} \]
因为负数都小于正数. 只需按邻接矩阵建图即可, 尤其在实现时要注意的是建图时必须用 \(0\) 覆盖所有自环的边权, 而这个问题在样例求解中不能体现.

总时间复杂度 \(O(tn^3)\), 空间复杂度 \(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