n个点,m条边
迭代n次,每次遍历所有边,进行更新
迭代k次:进过不超过k条边的最短dis
https://www.acwing.com/problem/content/855/
#include<iostream>
#include<string.h>
using namespace std;
const int N=10000+10;
struct node{
int a,b,w;
}edge[N];
int n,m,k;
int dis[N],backup[N];
int b_foly(){
memset(dis,0x3f,sizeof dis);
dis[1]=0;
for(int i=1;i<=k;i++){
memcpy(backup,dis,sizeof(dis));
for(int j=1;j<=m;j++){
int a=edge[j].a,b=edge[j].b,w=edge[j].w;
if(dis[b]>backup[a]+w)
dis[b]=backup[a]+w;
}
}
//cout<<backup[3]<<endl;
//cout<<dis[3]<<endl;
if(dis[n]>1e8) return -1;
return dis[n];
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
int a,b,w;
cin>>a>>b>>w;
edge[i]={a,b,w};
}
int t=b_foly();
if(t==-1) cout<<"impossible"<<endl;
else cout<<t<<endl;
return 0;
}