bellman-ford算法适用于有负边,且最短路径有边数限制的题目。
如果没有边数的限制并且有负边我们一般用spfa算法。
其实和普通版的dijkstra差不多,略微有几处不同的地方。

dist[n] > 0x3f3f3f3f / 2呢,因为这是负权边,有可能倒数第二个节点到最后一个节点是个负权的,然后就把最后一个节点给更新了。图示…
while(m--)。
来源AcWing
#include using namespace std;const int N = 510, M = 10010;int n, m, k;
int dist[N];
int last[N];struct Edges
{int a, b, w;
}edges[M];void bellman_ford()
{memset(dist, 0x3f, sizeof dist);dist[1] = 0;for (int i = 0; i < k; i ++){memcpy(last, dist, sizeof dist);for (int j = 0; j < m; j ++ ){dist[edges[j].b] = min(dist[edges[j].b], dist[edges[j].a] + edges[j].w);}}
}int main()
{cin >> n >> m >> k;for (int i = 0; i < m; i ++ ){int a, b, c;cin >> a >> b >> c;edges[i] = {a, b, c};}bellman_ford();if (dist[n] > 0x3f3f3f3f / 2) cout << "impossible" << "\n";else cout << dist[n] << "\n";
}