有边数限制的最短路

题目

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

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

输入格式

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

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

输出格式

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

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

数据范围

1≤n,k≤5001≤n,k≤500,
1≤m≤100001≤m≤10000,
任意边长的绝对值不超过 10000

题解

此题建议用bellman_ford算法,因为边权存在负环,并且有边数限制

#模板for k次 k为变数限制for(所有边)dist[b]=min(dist[b],dist[a]+w);
#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N=510,M=10010;struct Edge
{int a,b,c;
}edges[M];int n,m,k;
int dist[N];
int last[N];//因为更新后面点时可能发成串联,所有需要last数组将前一次结果存起来去更新后面点// 求1到n的最短路距离,如果无法从1走到n,则返回-1。
void bellman_ford()
{//将所有点赋值为正无穷memset(dist, 0x3f, sizeof dist);//第一个点赋值为0dist[1] = 0;// 如果第n次迭代仍然会松弛三角不等式,就说明存在一条长度是n+1的最短路径,由抽屉原理,路径中至少存在两个相同的点,说明图中存在负权回路。for (int i = 0; i < k; i ++ ){memcpy(last,dist,sizeof dist);//将前一次结果保留for (int j = 0; j < m; j ++ ){auto e=edges[j];dist[e.b]=min(dist[e.b],last[e.a]+e.c);//更新点}}}
int main()
{cin>>n>>m>>k;for(int i=0;i<m;i++){int a,b,c;cin>>a>>b>>c;edges[i]={a,b,c};}bellman_ford();if(dist[n]>0x3f3f3f3f/2) puts("impossible");//因正无穷可能被前一个正无穷更新所有要特判一下else cout<<dist[n];return 0;
}

bellman_ford相关推荐

  1. bellman_ford寻找平均权值最小的回路

    给定一个有向图,如果存在平均值最小的回路,输出平均值. 使用二分法求解,对于一个猜测值mid,判断是否存在平均值小于mid的回路 如果存在平均值小于mid的包含k条边的回路,那么有w1+w2+w3+. ...

  2. usaco Sweet Butter(迪杰斯特拉(优先队列优化),bellman_ford算法模板)

    这题开始用没有优化的迪杰斯特拉喜闻乐见的超时了,然后我用bellmanford算法按理说时间复杂度更大但是书上说往往只要很短的时间就可以求出最短路. 所以我用了这个算法但是我对这个算法还是不熟套了模板 ...

  3. 【HDU/算法】最短路问题 杭电OJ 2544 (Dijkstra,Dijkstra+priority_queue,Floyd,Bellman_ford,SPFA)

    最短路径问题是图论中很重要的问题. 解决最短路径几个经典的算法 1.Dijkstra算法 单源最短路径(贪心),还有用 priority_queue 进行优化的 Dijkstra 算法. 2.bell ...

  4. HDU1531(差分约束+Bellman_ford)

    题意:给出一个序列Si = {aSi, aSi+1, ..., aSi+ni} 和其子序列S = {a1, a2, ..., an}:在给出序列的约束条件: aSi + aSi+1 + ... + a ...

  5. poj3259(Bellman_ford算法)

    Bellman - ford算法:是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小.其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此 ...

  6. 含有负边的图的最短路径(Bellman_ford算法)

    更新所有的边,每条边更新V-1次,时间复杂度为O(V*E). 有些更新操作是重复了的,这里可以考虑检查多余的重复操作作,如果没有更新发生,则立即终止算法. #include<iostream&g ...

  7. Bellman_Ford算法

    Bellman_Ford算法和Dijkstra算法都可以用来求解有向图的单源最短路径问题,但是,相比于Dijkstra算法, Bellman_Ford算法允许边的权重为负值. 算法的详细讨论见算法导论 ...

  8. HDU 1317 XYZZY(floyd+bellman_ford判环)

    http://acm.hdu.edu.cn/showproblem.php?pid=1317 题意: 给出一个有向图,每到达一个点,都会加上或减去一些能量,我们要做的就是判断从1出发是否能到达n.初始 ...

  9. 差分约束系统之Bellman_Ford与Spfa判断负权回路

    题目:http://poj.org/problem?id=1364 题意:就是简单的差分约束模型. 分析:首先我们必须知道,如果图中存在负权回路,那么差分约束没有可行解.而存在负权回路的条件是:图中某 ...

  10. poj 1860 Currency Exchange (最短路bellman_ford思想找正权环 最长路)

    感觉最短路好神奇呀,刚开始我都 没想到用最短路 题目:http://poj.org/problem?id=1860 题意:有多种从a到b的汇率,在你汇钱的过程中还需要支付手续费,那么你所得的钱是 mo ...

最新文章

  1. Android SDK Tools Setup 提示 “ java se development kit not found”
  2. 编程入门python语言是多大孩子学的-如何看待将Python作为少儿编程的基础语言?...
  3. Regex 正则零宽断言
  4. keras训练完以后怎么预测_还在使用“龟速”的单显卡训练模型?动动手,让TPU节省你的时间...
  5. 十二、一篇文章帮助你快速读懂MySQL索引(B树、B+树详解)
  6. 协议森林14 逆袭 (CIDR与NAT)
  7. 【精彩回顾】软件DevOps云化发展的趋势
  8. python启动http服务_Python通过命令开启http.server服务器的方法
  9. html5触摸指定区域,HTML5/CSS3系列教程:HTML5 区域(Sectioning)的重要性
  10. dedecms进入mysql后台_DEDECMS 爆严重安全漏洞 免账号密码直接进入后台
  11. AutoCAD中的Spline曲线算法分析(二)
  12. 虚拟机安装程序没有找到安装在此计算机上的硬盘驱动器,安装VMware提示无效驱动器:E:\ 解决方法...
  13. Arcgis用矢量文件裁剪栅格图像
  14. java 弹出软键盘_android软键盘弹出定位
  15. Springboot查看MANIFEST.MF信息
  16. 我们为什么选择计算机专业?为什么学习编程?
  17. windows 防火墙解除或禁止ping方法
  18. 2021-06-21指针与变量 和字符数组作业。
  19. 行车记录仪开发方案比较--转载
  20. 【李佳辉_周报_2022.9.25】

热门文章

  1. 豆粕5连跌四月季节性偏弱,铁矿石认购翻倍,甲醇05-09季节性反套2022.3.30
  2. ELK学习总结(2-1)mavel -》sense 和 索引初始化
  3. Linux文件目录sha256,在Linux系统中使用SHA256来校验下载的文件的方法
  4. Unity Shader 之 简单 护盾Shield 效果的实现
  5. java RandomAccess 遍历效率
  6. 计算机往届生考研失败找工作,考研二战失败,我该如何找工作?
  7. android 动态改变字体大小
  8. python3 获取商店里App评论+解析+存档+筛选
  9. 国密PSAM卡与CPU(用户卡)操作过程 小结
  10. PDF时间戳数字签名