フェイス質問
ソリューション
これは最長経路に対して得られる最大の長さにフロイドのアルゴリズムによって構築された問題図の意味に応じて、単純な差分制約問題である.. \(| 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;
}