AcWing 853. 有边数限制的最短路
原题链接
简单
作者:
minux
,
2020-04-27 14:01:51
,
所有人可见
,
阅读 448
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int N=505;
const int M=1e4+5;
int n, m, k;
int DIS[N];
int BACK[N]; // 路径备份, 阻止结果覆盖
struct EDGE{
int x;
int y;
int w;
}edges[M];
int bellmanFord(){
// 最多经过k条边
DIS[1]=0;
for(int i=0; i<k; ++i){
memcpy(BACK, DIS, sizeof DIS);
for(int j=m-1; j>=0; --j){
int x=edges[j].x;
int y=edges[j].y;
int w=edges[j].w;
DIS[y]=min(DIS[y], BACK[x]+w);
}
}
if(DIS[n]>INF/2) return -1;
return DIS[n];
}
int main(){
memset(DIS, 0x3f, sizeof DIS);
cin>>n>>m>>k;
int x, y, w;
for(int i=0; i<m; ++i){
cin>>x>>y>>w;
edges[i]={x, y, w};
}
int res=bellmanFord();
if(res==-1) cout<<"impossible"<<endl;
else cout<<res<<endl;
return 0;
}