Bellman-Ford
求解有负权边的单源最路径问题。
时间复杂度
O
(
n
m
)
O(nm)
O(nm)
通常来说用SPFA
注意
备份距离数组的使用
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int m, n, k;
const int N = 505, M = 1e4+5;
int d[N], backup[N];
struct edge{
int a, b, w;
}E[M];
int bf(){
memset(d, 0x3f, sizeof d);
d[1] = 0;
for(int i = 0; i < k; i++){
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);
}
}
return d[n];
}
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}; //结构体赋值
}
int t = bf();
if(t > 0x3f3f3f3f/2) puts("impossible");
else cout<<t<<endl;
return 0;
}