算法基础之有边数限制的最短路

有边数限制的最短路

  • 核心思想:Bellman_ford 算法

    • 将a b w 用结构体储存

    •   #include
        #include
        #include
        
        using namespace std;
        
        const int N=510 , M=10010;
        
        int d[N],backup[N];  //d[N]为距离 backup[N]为备份
        int n,m,k;
        
        struct edge{  //维护a b w
            int a,b,w;
        }edges[M];
        
        int bellman_ford(){
            memset(d,0x3f,sizeof d);
            d[1] = 0;
            for(int i=0;i<k;i++){  //最多k条边 循环k次
                memcpy(backup,d,sizeof d);  //备份 防止串联
                for(int j=0;j<m;j++){  //搜索每一条边 更新距离
                    int a = edges[j].a , b = edges[j].b, w = edges[j].w;
                    d[b] = min(d[b] , backup[a] + w);
                }
            }
            if(d[n] > 0x3f3f3f3f / 2) return -2;  //因为存在负权 最终结果会比无穷大差一些
            return d[n];
        }
        
        int main(){
            cin>>n>>m>>k;
            
            for(int i=0;i<m;i++)
            {
                int a,b,w;
                cin>>a>>b>>w;
                edges[i] = {a,b,w};
            }
            
            int t = bellman_ford();
            if(t == -2) puts("impossible");
            else cout<<d[n];
        }
      

你可能感兴趣的:(算法,图论,数据结构,广度优先,c++)