【Bellman 限制边数】 有边数限制的最短路

传送门

题意

给一个\(n\)个点\(m\)条边的有向图,图中可能存在重边和自环, 边权可能为负数。
求出从\(1\)号点到\(n\)号点的最多经过\(k\)条边的最短距离,如果无法从\(1\)号点走到\(n\)号点,输出\(impossible\)

数据范围

\(\begin{array}{l}1 \leq n, k \leq 500 \\ 1 \leq m \leq 10000\end{array}\)
任意边长的绝对值不超过\(10000\)

题解

开一个\(back\)数组记录上次更新后的最短路径,每次的如果进行操作就在上一次的基础上更新,这样保证了每一次只更新一条边,进行\(k\)次就能求得是否存在长度为\(k\)的最短路

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
const int N=510,M=1e5+10,INF=0x3f3f3f3f;
struct node{int u,v,w;}e[M];
int n,m,k;
int dist[N],back[N];
int bellman()
{
    memset(dist,0x3f,sizeof dist);
    dist[1]=0;
    rep(i,0,k)
    {
        memcpy(back,dist,sizeof dist);
        rep(i,1,m+1)
        {
            int u=e[i].u,v=e[i].v,w=e[i].w;
            dist[v]=min(dist[v],back[u]+w);
        }
    }
    if(dist[n]>INF/2) return -1;
    else return dist[n];
}
int main()
{
    cin>>n>>m>>k;
    rep(i,1,m+1)
    {
        int u,v,w;
        cin>>u>>v>>w;
        e[i]={u,v,w};
    }
    int t=bellman();
    if(t==-1) cout<<"impossible"<<endl;
    else cout<<t<<endl;
    return 0;
}
posted @ 2020-06-01 13:56  Hyx'  阅读(142)  评论(0编辑  收藏  举报