解决单源最短路问题,存在负边权,时间复杂度 O ( n m ) O(nm) O(nm)
计算最多经过k步,从1到n的最小权重和。
#include<bits/stdc++.h>
using namespace std;
const int N = 510, M = 10010, INF = 0x3f3f3f3f;
int n, m, k;
int d[N], backup[N];
struct edge {
int a, b, w;
} e[M];
void bellman_ford () {
memset (d, 0x3f, sizeof d); // 注意初始化
d[1] = 0;
for (int i = 1;i <= k;i ++) { // 最多经过k条边
memcpy (backup, d, sizeof d); // 备份
for (int j = 0;j < m;j ++) {
int a = e[j].a, b = e[j].b, w = e[j].w;
d[b] = min (d[b], backup[a] + w);
}
}
}
int main()
{
cin >> n >> m >> k;
for (int i = 0;i < m;i ++) {
int a, b, w;
cin >> a >> b >> w;
e[i] = {a, b, w};
}
bellman_ford ();
if (d[n] > INF / 2) puts ("impossible"); // 存在负边权,可能会导致INF加上负边权而变小,所以不可以用等于INF来判断。
else cout << d[n] << endl;
return 0;
}
/*
3 3 1
1 2 1
2 3 1
1 3 3
3
2 1 1
1 2 -1
-1
*/