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;
}
 posted on 2019-08-14 17:51  谁是凶手1703  阅读(79)  评论(0)    收藏  举报