图论
图论
等待闪电
这个作者很懒,什么都没留下…
展开
-
图论——拓扑排序
思路:欲取得一个拓扑序列, 则该图必为有向无环图。开一个队列存放不在环中的点(包括自环)。首先可将入度为0的点加入队列,通过每个起点(即入度为0的点)遍历其所能到达的各点,每遍历到一点将该点入度减1, 若某点入度减为0,即可加入队列。因此对于该图中每个入度不为1的结点, 分为两种情况:1.点不在环中,则每一条经过该点的通路都可让该点入度减一,最终入度减为0,点入队列。2.点在环中,由上文知每一点需通过其前面的点访问从而减少入度,但前一点又需要前一点,则成循环论证,所以环中所有点都无法加入队列。&原创 2020-07-24 00:22:38 · 242 阅读 · 0 评论 -
二分图——染色法与匈牙利算法
二分图:n阶无向图G是二部图当且仅当G中无奇圈。染色法思路:由二分图定义, 对于图中每条边,其端点位于不同集合中,因此,对于图中每个连通快,可用dfs为其中每个点打上标记, 如果存在矛盾的点,则该图不为二分图。时间复杂度O(n+M).#include <iostream>#include <cstring>using namespace std;const int N = 100010, M = 200010;int e[M], ne[M], h[N], idx;原创 2020-08-03 22:26:24 · 597 阅读 · 0 评论 -
最小生成树——prim与kruskal算法
题目:传送门prim算法思路:用数组记录每个点到最小生成树所在集合的最小距离,每次选取距离最小的点以该距离加入集合,并用该点更新其他点的距离。#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 5010, M = 200010;int g[N][N], res, n, m;int dis[N]; // dis[i]:当前.原创 2020-08-03 09:48:21 · 148 阅读 · 0 评论 -
处理负权边——Bellman_ford与spfa算法
Bellman_ford算法思路:Bellman_ford算法遍历图中所有的边以更新各点的距离,对于无负权回路的图,最多经过n-1次(n为边数)遍历,便可找到最短距离。 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 150010;int dis[N], backup[N]; // backup为备份数组in原创 2020-07-31 21:43:48 · 326 阅读 · 0 评论 -
朴素Dijkstra与堆优化Dijkstra
朴素dijkstra:题目当面对单源最短路问题时,若所有边均为正权,则可用Dijkstra算法求解。思路:维护一个尚未确定到起点最短距离的点的集合,每次从该集合中选取一个到距离最短的点,则该点到起点的最短距离已近被确定,从该集合删除,并更新与该点相关的所有点距离。时间复杂度:O(n^2) ,n为点数。#include <iostream>#include <cstring>#include <algorithm>using namespace std;c原创 2020-07-28 17:25:13 · 299 阅读 · 0 评论