zoukankan      html  css  js  c++  java
  • acwing 853. 有边数限制的最短路 模板

    地址 https://www.acwing.com/problem/content/description/855/

    给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。

    请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible。

    注意:图中可能 存在负权回路 。

    输入格式

    第一行包含三个整数n,m,k。

    接下来m行,每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。

    输出格式

    输出一个整数,表示从1号点到n号点的最多经过k条边的最短距离。

    如果不存在满足条件的路径,则输出“impossible”。

    数据范围

    1n,k5001≤n,k≤500,
    1m100001≤m≤10000,
    任意边长的绝对值不超过10000。

    输入样例:
    3 3 1
    1 2 1
    2 3 1
    1 3 3
    输出样例:
    3

    解法 

    #include <iostream>
    #include <vector>
    #include <memory.h>
    
    
    using namespace std;
    
    const int N = 510;
    
    vector<vector<pair<int, int>>> v;
    int dist[N];
    int back[N];
    int n, m, k;
    
    /*
    3 3 1
    1 2 1
    2 3 1
    1 3 3
    */
    void solveInner(int back[])
    {
        for (int i = 0; i < v.size(); i++) {
            for (int j = 0; j < v[i].size(); j++) {
                int a = i; int b = v[i][j].first; int w = v[i][j].second;
                if (dist[b] > back[a] + w) {
                    dist[b] = back[a] + w;
                }
            }
        }
    }
    
    
    int solve()
    {
        memset(dist, 0x3f, sizeof(dist));
        dist[1] = 0;
    
        //进行n轮
        for (int i = 0; i < k; i++) {
            memcpy(back, dist, sizeof dist);
            solveInner(back);
        }
    
        if (dist[n] > 0x3f3f3f3f / 2) return -1;
        return dist[n];
    
    }
    
    
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        //cin >> n >> m >> k;
    
        v.resize(n + 1);
    
        for (int i = 0; i < m; i++) {
            int a, b, c;
            //cin >> a >> b >> c;
            scanf("%d%d%d",&a,&b,&c);
            v[a].push_back({ b,c });
        }
    
        int ret = solve();
    
        if (ret == -1) printf("impossible");
        else printf("%d
    ",ret); 
    
    
        return 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    软件杯学习:python爬虫爬取新浪新闻并保存为csv格式
    操作系统实验1:时间片轮转和存储管理动态分区分配及回收
    软件测试
    实验6-使用TensorFlow完成线性回归
    实验一
    pycharm中设置anaconda环境
    架构之美读书笔记一
    2.1学习总结:决策树分类器
    python自学日记一
    爱甩卖网站正式上线啦
  • 原文地址:https://www.cnblogs.com/itdef/p/12053690.html
Copyright © 2011-2022 走看看