#include <iostream>
#define I long long
#define C constexpr
#define Inf 1e10
#define int I
using namespace std;
C I N = 100 + 10;
int d[N][N], Low[N][N];
int f[N][N];
int n, q;
bool check (int day) {
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
f[i][j] = d[i][j];
for (int i = 1; i <= n; i ++) {
int Tp = (day / n) + (day % n > i);
for (int k = 1; k <= n; k ++) {
f[i][k] -= Tp;
if (f[i][k] < Low[i][k])
f[i][k] = Low[i][k];
f[k][i] -= Tp;
if (f[k][i] < Low[k][i])
f[k][i] = Low[k][i];
}
}
for (int k = 1; k <= n; k ++)
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
int Ans = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
Ans += f[i][j];
return Ans <= q;
}
signed main () {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> q;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
cin >> d[i][j];
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
cin >> Low[i][j];
int L = 0, r = 1e9, ans = -1;
while (L <= r) {
int mid = L + r >> 1;
if (check(mid))
r = mid - 1, ans = mid;
else
L = mid + 1;
}
cout << (ans == -1 ? ans : ans - 1);
return 0;
}
为什么最后 ans 要减去 1