AcWing 853. 有边数限制的最短路
原题链接
简单
作者:
云_580
,
2024-10-23 10:56:32
,
所有人可见
,
阅读 2
#include<bits/stdc++.h>
using namespace std;
const int N = 510,M = 1e5+10;
struct Edge{
int u,v,w;
}edges[M];
int n,m,k;
int dis[N],last[N];
void bellman_ford(){
memset(dis,0x3f,sizeof dis);
dis[1]=0;
//k次循环
for(int i = 1;i<=k;i++){
//存上次的所有dis数值,这次循环需要用到上次的数据
//如果不备份,可能会发生串联,第i次循环已经超过了k条边了
memcpy(last,dis,sizeof dis);
//每次循环对所有边进行更新操作
for(int j = 1;j<=m;j++){
auto e = edges[j];
dis[e.v]=min(dis[e.v],last[e.u]+e.w);
}
}
}
int main(){
cin>>n>>m>>k;
for(int i = 1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
edges[i]={x,y,z};
}
bellman_ford();
//这里是因为不连通的情况,负无穷也会被负权更新
if(dis[n]>0x3f3f3f3f/2)cout<<"impossible";
else cout<<dis[n];
return 0;
}