最短路

1.Floy 复杂度O(N3  适用于任何图(不存在负环)

模板 --kuangbin

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. const int INF = 0x3f3f3f3f;
  7. const int maxn = 1e3 + ;
  8.  
  9. int mp[maxn][maxn];
  10. int n, m;
  11.  
  12. int main() {
  13. scanf("%d%d", &n, &m);
  14. for (int i = ; i <= n; i++) {
  15. for (int j = ; j < m; j++) {
  16. if (i == j) mp[i][j] = ;
  17. else mp[i][j] = INF;
  18. }
  19. }
  20. int u, v, w;
  21. for (int i = ; i <= m; i++) {
  22. scanf("%d%d%d", &u, &v, &w);
  23. mp[u][v] = w;
  24. }
  25. for (int k = ; k <= n; k++) {
  26. for (int i = ; i <= n; i++) {
  27. for (int j = ; j <= n; j++) {
  28. mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);
  29. }
  30. }
  31. }
  32. for (int i = ; i <= n; i++) {
  33. for (int j = ; j <= n; j++) {
  34. printf("%10d", mp[i][j]);
  35. }
  36. printf("\n");
  37. }
  38. return ;
  39. }

2.Dijkstra   适用于单源最短路 非负权图   堆优化 复杂度O((n+m)logm)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<queue>
  6. using namespace std;
  7.  
  8. const int INF = 0x3f3f3f3f;
  9. const int maxn = 1e3 + ;
  10.  
  11. struct Node {
  12. int v, c; //c为到v点的最短路长度
  13. Node(int _v = ,int _c=): v(_v),c(_c) {}
  14. friend bool operator < (Node a, Node b) {
  15. return a.c > b.c;
  16. }
  17. };
  18.  
  19. struct Edge {
  20. int v, cost;
  21. Edge(int _v = , int _cost = ) : v(_v), cost(_cost) {}
  22. };
  23.  
  24. vector<Edge> E[maxn];
  25.  
  26. void add_edge(int u, int v, int w) {
  27. E[u].push_back(Edge(v, w));
  28. }
  29.  
  30. int n, m;
  31. bool vis[maxn];
  32. bool dis[maxn];
  33.  
  34. void Dijkstra(int n, int start) {
  35. memset(vis, , sizeof vis);
  36. for (int i = ; i <= n; i++) dis[i] = INF;
  37. priority_queue<Node> q;
  38. while (!q.empty()) q.pop();
  39. dis[start] = ;
  40. q.push(Node(start, ));
  41. Node tmp;
  42. while (!q.empty()) {
  43. tmp = q.top(); q.pop();
  44. int u = tmp.v;
  45. if (vis[u]) continue;
  46. vis[u] = true;
  47. for (int i = ; i < E[u].size(); i++) {
  48. int v = E[tmp.v][i].v;
  49. int cost = E[u][i].cost;
  50. if (!vis[v] && dis[v] > dis[u] + cost) {
  51. dis[v] = dis[u] + cost;
  52. q.push(Node(v, dis[v]));
  53. }
  54. }
  55. }
  56. }
  57.  
  58. int main() {
  59. scanf("%d%d", &n, &m);
  60. int u, v, w;
  61. for (int i = ; i < m; i++) {
  62. scanf("%d%d%d", &u, &v, &w);
  63. add_edge(u, v, w);
  64. }
  65. Dijkstra(n, );
  66. for (int i = ; i <= n; i++) printf("%d ", dis[i]);
  67. return ;
  68. }

Bellman-Ford 算法

用于求解单源最短路问题的算法  可以肯定最短路径包含的边条数不会超过n-1个,或者说结点不超过n个 若超过说明形成一个环,又环权值是正的我们可以路径上将这个环删除路径长度就会变小

可用于有向图判断是否存在负环

总复杂度O(NM) 

  1. relax(u, v) {
  2. dist[v] = min(dist[v], dist[u] + edge_len(u, v));
  3. }
  4. for (i = ; i <= n; i++) {
  5. dist[i] = edge_len(S, i);
  6. }
  7. for (i = ; i < n; i++) {
  8. for each edge(u, v) {
  9. relax(u, v);
  10. }
  11. }

Bellman-Ford 算法 优化  SPFA 最坏O(NM)

   存在负边权时用SPFA

利用队列存储需要更新的结点,每次从队列中取出一个结点,计算是否有结点需要更新,如果有并且这个点不在队列里那么将它加入队列。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<queue>
  6. using namespace std;
  7.  
  8. const int INF = 0x3f3f3f3f;
  9. const int maxn = 1e3 + ;
  10.  
  11. struct Edge {
  12. int v, cost;
  13. Edge(int _v,int _cost): v(_v),cost(_cost) {}
  14. };
  15.  
  16. vector<Edge> E[maxn];
  17.  
  18. void add_edge(int u, int v, int w) {
  19. E[u].push_back(Edge(v, w));
  20. }
  21.  
  22. bool vis[maxn];
  23. int cnt[maxn];
  24. int dis[maxn];
  25.  
  26. bool spfa(int n, int start) {
  27. memset(vis, , sizeof vis);
  28. for (int i = ; i <= n; i++) dis[i] = INF;
  29. vis[start] = true;
  30. dis[start] = ;
  31. queue<int> q;
  32. while (!q.empty()) q.pop();
  33. q.push(start);
  34. memset(cnt, , sizeof cnt);
  35. cnt[start] = ;
  36. while (!q.empty()) {
  37. int u = q.front();
  38. q.pop();
  39. vis[u] = true;
  40. for (int i = ; i < E[u].size(); i++) {
  41. int v = E[u][i].v;
  42. if (dis[v] > dis[u] + E[u][i].cost) {
  43. dis[v] = dis[u] + E[u][i].cost;
  44. if (!vis[v]) {
  45. vis[v] = true;
  46. q.push(v);
  47. if (++cnt[v]> n) return false;
  48. }
  49. }
  50. }
  51. }
  52. return true;
  53. }

HZNU-ACM寒假集训Day4小结 最短路的更多相关文章

  1. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  2. 中南大学2019年ACM寒假集训前期训练题集(入门题)

    A: 漫无止境的八月 Description 又双叒叕开始漫无止境的八月了,阿虚突然问起长门在这些循环中团长哪几次扎起了马尾,他有多少次抓住了蝉等等问题,长门一共回复n个自然数,每个数均不超过1500 ...

  3. HZNU-ACM寒假集训Day8小结 最小生成树

    最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络   https://www.luogu.com.cn/problem/P1546 #i ...

  4. HZNU-ACM寒假集训Day3小结 搜索

    简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...

  5. HZNU-ACM寒假集训Day1小结 STL 并查集

    常用STL 1.优先队列 priority_queue 内部是用堆(heap)实现的 priority_queue<int> pq; 默认为一个“越小的整数优先级越低的优先队列” 对于一些 ...

  6. 2022寒假集训day4

    day4(day5补完的) 继续刷搜索方面的题, 初步了解了序列. T1 迷宫问题 题目描述设有一个 n*n 方格的迷宫,入口和出口分别在左上角和右上角.迷宫格子中分别放 0 和 1 ,0 表示可通, ...

  7. 【集训Day4 动态规划】【2018寒假集训 Day4 更新】蛙人

    蛙人 (ple) 蛙人使用特殊设备潜水.设备中有一个气瓶,分两格:一格装氧气,另一格装氮气.留在水中有时间的限制,在深水中需要大量的氧气与氮气.为完成任务,蛙人必须安排好气瓶.每个气瓶可以用它的重量和 ...

  8. HZNU-ACM寒假集训Day12小结 数论入门 题解

    算不出的等式 BJOI2012 看到这题 真没什么办法 无奈看题解 1.注意到p/q 联想到斜率 2.注意到 [ ] 联想到整点 注意到k在变化,构造一次函数 f(x)=p/q*x ,g(x)=q/p ...

  9. HZNU-ACM寒假集训Day12小结 数论入门

    符号说明 a|b      a整除b (a,b)    a与b的最大公因数 [a,b]     a与b的最小公倍数 pα||a    pα|a但pα+1∤a a≡b(mod m) a与b对模m同余 a ...

随机推荐

  1. 弱点扫描-openvas初始化

    OPENVAS: NESSUS项目分支:商业版的扫描器 管理目标系统的漏洞 免费开源 Kali 默认安装但是未配置个启动 安装 创建证书 同步弱点数据库 创建客户端证书 重建数据库 备份数据库 启动服 ...

  2. emmmmmmmmmmmmmmmmmm01

    当体会活着有多么难之后,就不要在那么随意的活着,今天有多么不在意自己的人生,明天就要加倍的被别的人左右自己的人生. 多思考,多学习,多总结,多创造.让自己成为有用的人,让自己未来有一天成为自己的主人.

  3. jenkins#配置插件加速

    系统管理 -> 插件管理  -> 高级  -> 升级站点 -> 填写新的url -> 提交. 新的url为:https://mirrors.tuna.tsinghua.e ...

  4. 强大的promise

    这个玩意叫做普罗米修斯,希腊神话的盗火英雄 promise只用来包装异步函数,同步的会搞乱执行顺序,生产BUG // 如何使用 function pro(){ return new Promise(f ...

  5. Scala 线性化规则和 super 操作

    如果一个类有多个父类,且父类的有相同的函数 f,在子类和父类中调用 super.f 都是按从右到左的调用函数的顺序. 这个规则名为:Linearization Rules 如下的代码 trait Ba ...

  6. java格式化代码(java格式化代码工具类)

    下别人的原来链接..... 支持效果不好要想格式化好需要解析语法树   7个积分我这里免费下      转自 https://download.csdn.net/download/jkl012789/ ...

  7. P 1008 数组元素循环右移问题

    转跳点:

  8. MySql索引原理分析

    面试 问:数据库中最常见的慢查询优化方式是什么? 同学A:加索引. 问:为什么加索引能优化慢查询?同学A:...不知道同学B:因为索引其实就是一种优化查询的数据结构,比如Mysql中的索引是用B+树实 ...

  9. 144-PHP trim函数的使用

    <?php //定义多个字符串 $str1='whello12x'; $str2='3462hello'; $str3='xayABCaxy'; $str1=trim($str1,'a..z') ...

  10. 干货分享|Critique Essay写作解析

    Critique essay要求学生对另一篇文章进行批判性分析,通常是一本书.期刊文章或论文.不管你的专业是什么,你可能会被要求在某个时候写一篇Critique essay.拿心理学专业举例,评论一篇 ...