适用条件
Bellman-ford算法适用于单源最短路径,图中边的权重可为负数即负权边,但不可以出现负权环。和有边数限制的最短路 。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
int n,m,k,d[N];
struct node{
int a;
int b;
int v;
}edge[N];
int pre[N];
int bellman_ford(){
memset(d,0x3f,sizeof d);
d[1]=0;
//k为限制的边数
/*第i次循环后,若存在起点到终点有<=i条边的路径,就一定能找出
i条边内起点到终点的最短路*/
for(int i=0;i<k;i++){
memcpy(pre,d,sizeof d);
for(int j=0;j<m;j++){
int a=edge[j].a,b=edge[j].b,v=edge[j].v;
d[b]=min(d[b],pre[a]+v);
}
}
}
int main(){
cin>>n>>m>>k;
for(int i=0;i<m;i++){
cin>>edge[i].a>>edge[i].b>>edge[i].v;
}
bellman_ford();
if(d[n]>0x3f3f3f3f/2) cout<<"impossible"<<endl;
else cout<<d[n]<<endl;
return 0;
}