zoukankan      html  css  js  c++  java
  • 【Bellman 限制边数】 有边数限制的最短路

    传送门

    题意

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

    数据范围

    (egin{array}{l}1 leq n, k leq 500 \ 1 leq m leq 10000end{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;
    }
    
  • 相关阅读:
    项目alpha冲刺-测试
    项目Alpha冲刺--9/10
    项目Alpha冲刺--8/10
    项目Alpha冲刺--7/10
    项目Beta冲刺(1/7)(追光的人)(2019.5.23)
    Beta之前-凡事预则立(校园帮-追光的人)
    事后诸葛亮(追光的人)
    问题回答
    Alpha冲刺总结
    Alpha冲刺(10/10)——追光的人
  • 原文地址:https://www.cnblogs.com/hhyx/p/13024818.html
Copyright © 2011-2022 走看看