题面
解
这是一个简单的差分约束问题. 依题意建图, 用 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;
}