![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
文章平均质量分 62
KRYON!
这个作者很懒,什么都没留下…
展开
-
DFS生成森林代码
DFS生成森林代码typedef char TElemType;typedef struct CSNode{ TElemType data; CSNode *firstChild, *nextSibling;}CSNode,*CSTree; void DFSForest(Graph G,CSTree &T){ T = NULL; //生成森林的根 bool visited[MAXSIZE]; //标记 for(int i = 0; i < G.vexnum; i+原创 2020-12-16 15:18:02 · 602 阅读 · 0 评论 -
[leetcode]1368. 使网格图至少有一条有效路径的最小代价
dijistraclass Solution { int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0};public: int minCost(vector<vector<int>>& grid) { priority_queue<pair<in...原创 2020-03-02 22:14:59 · 204 阅读 · 0 评论 -
[leetcode]5321. 阈值距离内邻居最少的城市
多源最短路径类型的题目1、floydWarshallclass Solution {public: void floydWarshall(int n,vector<vector<int>>& graph,vector<vector<int>>& dist) { for(int k = 0;...原创 2020-01-27 22:46:02 · 133 阅读 · 0 评论 -
有向图的传递闭包实现三种实现(Warshall+DFS+BFS)
一、传递闭包:定义:有n个顶点的有向图的传递闭包可以定义为一个n阶布尔矩阵T[n][n],如果i能到j则T[i][j] =1,否则T[i][j] =0意义:对于无向图,我们可以通过并查集来实现两个顶点是否有通路的快速查询。但有向图不能有并查集,所以现在可以用传递闭包了(当然无向图也可以用)通过Floyd-Warshall算法https://blog.csdn.net/qq_4069105...原创 2019-11-30 17:30:50 · 2056 阅读 · 0 评论 -
带权有向无环图的最短路径(使用拓扑排序的方法)
声明:我测试的样例答案都正确,如果代码有问题还请指出。代码:#include<iostream>#include<list>#include<vector>#include<queue>#include<set>#include<memory.h> #include<time.h>#define ...原创 2019-11-30 16:14:57 · 1777 阅读 · 0 评论 -
最短路径和最小生成树的区别
最小生成树是把连通的图的所有顶点连起来路径之和最小的问题,即生成树总权值之和最小。应用如网络部线,把所有的电脑(服务器?)都连起来用的网线(光纤?)最少,即用最小的代价让全村人都能上网:)2.最短路径是把两点之间路径最短的问题,应用如导航,两个地方怎么走距离最短。可以存在到不了的情况。...原创 2019-11-27 19:34:06 · 1028 阅读 · 0 评论 -
FloydWarshall多(所有)源点的最短路径实现(带路径打印)
一、介绍和算法原理:https://www.cs.usfca.edu/~galles/visualization/Floyd.html二、核心代码:dist[i][j]表示从i到j的最短距离,parent[i][j]表示源点为i时,j的双亲是谁,一开始我都初始化parent[i][j] = i下面的是这个算法的核心代码,这个上面图片有解释,我觉得也可以这样理解: for(int k...原创 2019-11-28 11:20:14 · 197 阅读 · 0 评论 -
Bellman_Ford边上权值为任意值的单源最短路径问题(+路径打印)边集合与邻接表两种实现
一、介绍:二、维基上的伪代码: function BellmanFord(list vertices, list edges, vertex source) ::distance[],predecessor[] // This implementation takes in a graph, represented as // lists of vertices a...原创 2019-11-30 15:12:51 · 226 阅读 · 0 评论 -
dijkstra--非负权值的单源最短路径STL实现(邻接表+优先队列) (带路径)
一、预备知识:用优先队列做大小根堆注意:是非负权值的单源最短路径的STL实现,权值是负的不能用dijkstra算法,二、代码:#include<iostream>#include<cstdio>#include<list>#include<queue>#include<set>#define INF 9999999u...原创 2019-11-26 17:48:51 · 216 阅读 · 0 评论 -
prim最小生成树算法 邻接表+STL实现
一、预备知识优先队列二、代码:#include<iostream>#include<list>#include<vector>#include<map> #include<queue>#define INF 9999999using namespace std;class Graph{ int n; list...原创 2019-11-26 17:22:18 · 292 阅读 · 0 评论 -
最小生成树----kruskal算法代码
#include<iostream>#include<vector>#include<algorithm> using namespace std;class Subset{public: int* parent; int* rank; Subset(int n) { parent = new int[n]; rank = new...原创 2019-11-23 12:21:33 · 339 阅读 · 0 评论 -
打印所有的拓扑排序
参考kahn算法的:https://blog.csdn.net/qq_40691051/article/details/103145110#include<iostream>#include<list>#include<vector>#include<queue>using namespace std;class Graph{ ...原创 2019-11-19 18:57:52 · 832 阅读 · 0 评论 -
拓扑排序----Kahn算法和字典序最小的拓扑排序
一、拓扑排序定义:二、卡恩算法(Kahn):1、Kahn算法介绍:有向无环图DAG至少具有一个度数为0的顶点和一个度数为0的顶点。证明:上述事实有一个简单的证明,即DAG不包含循环,这意味着所有路径的长度都是有限的。现在,使S为从u(源)到v(目标)的最长路径。由于S是最长的路径,因此不会有到u的传入边缘,也不会有从v的传出边缘,因此,如果发生这种情况,则S不会是最长的路径=>...原创 2019-11-19 17:21:08 · 1730 阅读 · 0 评论 -
打印一种拓扑排序(假定给的是有向无环图时)DFS+栈
一、定义:在计算机科学领域,有向图的拓扑排序是其顶点的线性排序,使得对于从顶点u 到顶点v的每个有向边uv,u在排序中都在v之前。例如,图形的顶点可以表示要执行的任务,并且边可以表示一个任务必须在另一个任务之前执行的约束;在这个应用中,拓扑排序只是一个有效的任务顺序。如果且仅当图形没有定向循环,即如果它是有向无环图(DAG),则拓扑排序是可能的。任何DAG具有至少一个拓扑排序,并且已知这...原创 2019-11-19 15:01:19 · 564 阅读 · 0 评论 -
打印有向图的强连通分量-----kosaraju算法(最简单的实现)
一、kosaraju算法步骤:1、首先对图G进行一次DFS,记录每个顶点完成的顺序(DFS树/林的叶子节点先完成,然后回溯到它双亲这一层,它个双亲递归遍历完自己的邻居并在这些递归完成回溯到这层后,它自己也完成了。如这个图:假设从1开始DFS,那么完成的顺序是:假设它的DFS生成树是这个:那么各顶点的完成的顺序是:3,5,4,2,12、把图G所有的边方向,得到G',沿步骤1得到顺序,从...原创 2019-11-18 20:08:45 · 380 阅读 · 2 评论 -
图论---桥(割边)
一、定义:维基百科:二、代码:#include<iostream>#include<list>#include<algorithm>using namespace std;#define NIL -1class Graph{ int n; list<int> *adj; void bridgeUtil(int u,b...原创 2019-11-18 16:22:14 · 855 阅读 · 0 评论 -
有向图的强连通分量--Tarjan算法---代码分析
本文就是做个代码分析,顺便说下理解。一、预备知识:需要知道什么是: 回边、前向边、交叉边二、上代码:#include<algorithm>#define NIL -1using namespace std;class Graph{ int n; list<int>*adj; void SCCUtil(int u,int disc[],int...原创 2019-11-17 20:01:51 · 230 阅读 · 0 评论 -
强连通图------(1)通过两次DFS或BFS判断是不是强连通图
一、定义:强连通图(Strongly Connected Graph)是指在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。二、判断是不是强连通图的算法:下面是Kosaraju基于DFS的简单算法,这算法对图进行了两次DFS遍历:1) 将所有顶点初始化为未访问。2)从任意顶点v开始进行图的DFS遍历。如果DFS遍历没有访问完所有顶...原创 2019-11-16 20:46:10 · 2820 阅读 · 0 评论 -
寻找无向图的关节点(Articulation Points)和判断图是否是双连通图(Biconnect Graph)
一、定义:关节点(Articulation Poinst)是指,在原本连通的图,在删除关节点及依附的边之后,图将被分割成至少两个连通分量(原本整连通的图变得不连通)。另外,没有一个关节点的连通图称为双连通图(Biconnect Graph)二、求解算法:先贴一张数据结构书(《数据结构c语言描述–殷人昆》,额,我好像免费帮他们打广告了)上的介绍最底下也写了,利用DFS树判断关节点的原则是...原创 2019-11-16 14:37:14 · 7869 阅读 · 1 评论 -
图(用list邻接表表示)的深度优先和广度优先(递归和非递归实现)
#include<iostream>#include<string>#include<list>#include<queue>using namespace std;class Graph{ int n; //结点个数 list<int> *adj; //邻接表public: Graph(int _n)...原创 2019-11-12 20:29:21 · 207 阅读 · 0 评论 -
图的存储--邻接矩阵和邻接表(链表实现和用vector实现)
邻接矩阵:#include<iostream>#include<vector>#include<iomanip>#include<string>using namespace std;const int maxVertices = 30; //图中顶点数目的最大值const int maxEdges = 900; ...原创 2019-11-11 20:38:48 · 382 阅读 · 1 评论 -
无权有向图的最短路径
为什么使用BFS就够了?因为BFS的时候离src越近的点越早被访问(先进先出)。代码:#include<iostream>#include<list>#include<vector>#include<queue>#define INF 9999999 //无穷大 #define NIL -1 using n...原创 2019-11-29 10:16:22 · 806 阅读 · 0 评论