没有负环等价于每个点都存在最短路。那么就是要找到一组标号 \(a_i\),使得对于每条 \(u \to v\) 且边权为 \(d\) 的边,都有 \(a_v - a_u \le d\)。
如果我们差分 \(b_i = a_i - a_{i + 1}\),那么每个 \(b_i\) 非负,且 \(b_i \ge 2\) 一定不优,所以只用考虑 \(b_i \in \{0, 1\}\) 的情况。
发现 \(i < j\) 的边当区间和 \(= 0\) 时必须删除,\(i > j\) 的边当区间和 \(\ge 2\) 时必须删除。
设 \(f_{i, j}\) 为最后一个 \(1\) 在位置 \(i\),倒数第二个 \(1\) 在位置 \(j\),转移枚举倒数第三个 \(1\) 的位置 \(k\) 即可。
转移系数可以朴素二维前缀和处理。
时间复杂度 \(O(n^3)\)。
code
// Problem: D - Negative Cycle
// Contest: AtCoder - AtCoder Grand Contest 036
// URL: https://atcoder.jp/contests/agc036/tasks/agc036_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;
const int maxn = 510;
ll n, a[maxn][maxn], b[maxn][maxn], f[maxn][maxn], c[maxn][maxn];
inline ll qsum(int xl, int xr, int yl, int yr) {
return b[xr][yr] + b[xl - 1][yl - 1] - b[xl - 1][yr] - b[xr][yl - 1];
}
void solve() {
scanf("%lld", &n);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (i == j) {
continue;
}
scanf("%lld", &a[i][j]);
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
b[i][j] = b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1] + a[i][j];
}
}
for (int i = n; i; --i) {
for (int j = i; j <= n; ++j) {
c[i][j] = c[i + 1][j] + c[i][j - 1] - c[i + 1][j - 1] + a[i][j];
}
}
mems(f, 0x3f);
ll ans = 9e18;
for (int i = 1; i < n; ++i) {
f[i][0] = c[1][i];
ans = min(ans, f[i][0] + c[i + 1][n]);
for (int j = 1; j < i; ++j) {
for (int k = 0; k < j; ++k) {
f[i][j] = min(f[i][j], f[j][k] + c[j + 1][i] + qsum(j + 1, i, 1, k));
}
// printf("%d %d %lld %lld %lld\n", i, j, f[i][j], c[i + 1][n], qsum(i, n, 1, j));
ans = min(ans, f[i][j] + c[i + 1][n] + qsum(i + 1, n, 1, j));
}
}
printf("%lld\n", ans);
}
int main() {
int T = 1;
// scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}
- Negative AtCoder Contest Grand Cyclenegative atcoder contest grand authentic atcoder contest grand atcoder contest radius grand atcoder contest grand 001 atcoder contest grand 022 avoidance atcoder contest grand histogram atcoder contest grand atcoder contest grand 019 atcoder contest grand 017 atcoder contest grand 039