首页 > 编程语言 >讲课:拓扑排序、最短路算法

讲课:拓扑排序、最短路算法

时间:2023-04-17 21:22:19浏览次数:51  
标签:讲课 拓扑 入度 队列 算法 排序 短路

什么是图?

把图在计算机中表示(储存)

拓扑排序

  • 与一个顶点 v 关联的边的条数称作该顶点的 度 (degree)
  • 在有向图 G = (V, E) 中,以一个顶点 v 为起点的边的条数称为该顶点的 出度 (out-degree),
  • 以一个顶点 v 为终点的边的条数称为该节点的 入度 (in-degree)

思路

  • 首先记录各个点的入度

  • 然后将入度为 0 的点放入队列

  • 将队列里的点依次出队列,然后找出所有出队列这个点发出的边,删除边,同事边的另一侧的点的入度 -1。

  • 如果所有点都进过队列,则可以拓扑排序,输出所有顶点。否则输出-1,代表不可以进行拓扑排序。

参考代码

应用

判断图中是否有环路

练习

luogu P1347排序

最短路算法

dijkstra单源最短路算法

dijkstra

练习

acwing 4240.青蛙

bellman-ford 算法和SPFA优化

  • bellman-ford 算法的松弛操作
  • 枚举所有边,松弛所有点到原点的距离
  • 跑正常的有最短路的图没问题(最短路径存在,并且显然不超过点的数量-1)
  • 但存在负环时,可以知道途中不存在最短路,因为每次松弛都会把最短路变得越来越小,没有意义
  • 一般来说,一个图存在负环,就不可能有最短路,所以用处不多,最多用来判断是否存在负环
  • spfa只有上一次被松弛的结点,所连接的边,才有可能引起下一次的松弛操作。

folyd 多源最短路

借助中间点来设计最短路算法

  • 定义一个数组 f[k][x][y],表示只允许经过结点 1 到 k,结点 x 到结点 y 的最短路长度。
  • f[0][x][y]:x 与 y 的边权,或者 0,或者 无穷
  • f[k][x][y] = min(f[k-1][x][y], f[k-1][x][k]+f[k-1][k][y])(f[k-1][x][y],为不经过 k 点的最短路径,而 f[k-1][x][k]+f[k-1][k][y],为经过了 k 点的最短路)。

核心代码


因为第一维对结果无影响,我们可以发现数组的第一维是可以省略的,于是可以直接改成 f[x][y] = min(f[x][y], f[x][k]+f[k][y])。

总结

拓扑排序

  • 理解度的含义
  • 然后将入度为 0 的点放入队列,删边,更新度数,再次入队

最短路


标签:讲课,拓扑,入度,队列,算法,排序,短路
From: https://www.cnblogs.com/cfddfc/p/17327428.html

相关文章

  • free (牛客多校) (dj最短路+dp优化处理)
    本题大意:给出n,m,s,t,k,n个点,m条路,求s到t的最短路,并且最多k条路免费,然后给出m行,u,v,w,代表u到v有一条权值为w的双向路。 思路:就是dj最短路+一个dp维度的处理,dp[i][j],到第i个节点用了多少个免费的路径的最短路径 ......
  • 最短路合辑
    Dijkstra算法,堆优化版本复杂度是mlog(m)。适合于没有负权的图。#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;constintN=1e5+5;constintINF=0x3f3f3f3f;vector<pair<int,int>>G[N];intvis[N];intdist[N];voiddij(ints){......
  • 2642. 设计可以求最短路径的图类
    题目链接:2642.设计可以求最短路径的图类方法一:Dijkstra解题思路每次调用\(shortestPath(st,ed)\)时,就通过\(Dijkstra\)算法计算\(st\)->\(ed\)的最短路。代码朴素写法classGraph{private:vector<vector<int>>adj;inte[110][110],n;public:G......
  • Dijkstra算法求最短路
    一、Dijkstra 只适用于单源最短路中所有边权都是正数的情况二、存储方式1、稠密图用邻接矩阵2、稀疏图用邻接表三、算法实现用一个dist数组保存源点到其余各个节点的距离,dist[i]表示源点到节点i的距离。将dist数组赋值为正无穷,dist[1]=0用......
  • UVA 12295 Optimal Symmetric Paths 最短路求方案数
    题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23587题意:给一个n*n的矩阵,每个方格中有一个数字,从左上角走到右下角,且路径必须关于副对角线对称,求使路线上数字和最小的方案数思路:既然要关于副对角线对称,那么可以把关于副对角线对称的方格的值加到一起去,这样就......
  • LeetCode 周赛 340,质数 / 前缀和 / 极大化最小值 / 最短路 / 平衡二叉树
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周跟大家讲到小彭文章风格的问题,和一些朋友聊过以后,至少在算法题解方面确定了小彭的风格。虽然竞赛算法题的文章受众非常小,但却有很多像我一样的初学者,他们有兴趣参加但容易被题目难......
  • Codeforces Round #303 (Div. 2) E. Paths and Trees (最短路+变形最小生成树)
    题目地址:E.PathsandTrees模拟了一场CF,这场实在太水了。。边玩边做的。。最后半分钟交了一发E题。。不幸AK绝杀失败。。。。首先的思路肯定是先求最短路,把可能为最短路的边挑出来,然后第二步我本来写的是直接用无向图的最小生成树,于是绝杀失败。。。后来才发现这样是不行的。......
  • (CCPC F题)UESTC 1220 The Battle of Guandu (最短路)
    题目地址:UESTC1220比赛的时候翻译完想了一小会就没再管。结果K题也没调试出来。。这题是很神奇的图论题,建图方式是从y[i]到x[i]连一条有向边,权值为c[i]。然后将所有重要性为0的设为源点,然后跑最短路,结果就是所有重要性为2的点的最短距离。实在是不好解释和证明这种建图的正......
  • Codeforces Round #Pi (Div. 2) E. President and Roads (最短路+强连通求割边)
    题目地址:codeforces#pi(DIV2)E题目很水。。就是先求两边最短路,然后把可能为最短路的边挑出来,然后判断是否yes只需要转化成无向图跑一遍tarjan,找出割边,割边就是yes,然后剩下的边就让它的值为最短路-1就行了,如果-1后变成了非正数,就是no.但是!!!居然卡spfa!!那是不是说cf以后就不......
  • POJ 1094Sorting It All Out(拓扑排序)
    题目地址:http://poj.org/problem?id=1094这个题改了一下午。。代码越改越挫。。凑活着看吧。。#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<ctype.h>#include<queue>#include<map>......