給定 n 個星系(節點)和 m 個蟲洞(有向邊),每條邊有權值 t(可為負數,表示時間差)。判斷圖中是否存在負權環(即可無限回到過去)。多組測試資料,n ≤ 1000, m ≤ 2000。
經典 Bellman-Ford 算法檢測負環:
d[0]=0,其餘 INF。d[u] + w < d[v] 則更新 d[v]。#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXM = 2005;
const int INF = 0x3f3f3f3f;
int n, m;
int u[MAXM], v[MAXM], w[MAXM];
int d[MAXM];
bool bellmanFord() {
fill(d, d+n, INF);
d[0] = 0;
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < m; j++) {
if (d[u[j]] < INF && d[v[j]] > d[u[j]] + w[j])
d[v[j]] = d[u[j]] + w[j];
}
}
for (int j = 0; j < m; j++) {
if (d[u[j]] < INF && d[v[j]] > d[u[j]] + w[j])
return true; // 存在負環
}
return false;
}
int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++)
scanf("%d %d %d", &u[i], &v[i], &w[i]);
puts(bellmanFord() ? "possible" : "not possible");
}
return 0;
}
時間複雜度 O(n×m),空間複雜度 O(n+m),滿足題目限制。