图论
文章平均质量分 88
数学小牛马
数学专业本科在读,有奇奇怪怪的coding算法/或者其他想法的可以留言,我会积极为大家带来更多好的原创博文~
展开
-
Bellman-Ford算法cpp算法导论原理实现
Bellman-Ford算法该算法的特性是针对更广泛情况下的最短路径查询,其中边权可以为负数,并且会针对数据判断图中是否有从源节点到达负权环路的路径。方法依旧基于Class<Graph>实现,其中对少数地方做了对应修正,在带权边最短路算法中需要两个最基本的操作:初始化操作:使得除了根节点以外的节点d属性设置为∞\infty∞,前驱节点设置为空,这里的d属性表示的是该节点距离源节点的上界或标准最小值;void Graph::InitializeSingleSource(string s原创 2022-04-18 16:35:50 · 503 阅读 · 0 评论 -
[算法导论24章]单源最短路径Ⅰ
Background最短路径更多的是针对一张有向有权图G=(V,E)G=(V,E)G=(V,E),图中存在某条路径:p=<v0,v1,...,vk>p=<v_0,v_1,...,v_k>p=<v0,v1,...,vk>则其路径的权重则为点集合对应的边权之和:w(p)=∑i=1kw(vi−1,vi)w(p)=\sum_{i=1}^{k} w\left(v_{i-1}, v_{i}\right)w(p)=i=1∑kw(vi−1,vi)所以定义最短原创 2022-04-16 21:14:23 · 985 阅读 · 0 评论 -
算法导论Prim算法原理及其实现
Prim算法中文被称为普利姆算法,作为一种最小生成树的常见算法,与上节所介绍的KruskalKruskalKruskal算法存在的区别为:KruskalKruskalKruskal算法:将边权从小到大排序后选择作为两个树的连接边的边加入集合作为最小生成树边集;PrimPrimPrim算法:一棵最小生成树中的所有连接不同树木的临边选择边权最小的边加入集合作为最小生成树边集合;上述两个方法前者更倾向于以边位主连接不同森林,后者则更倾向于以一颗树开始找不同森林的边,如此操作的终止条件都为:图中没有原创 2022-04-12 10:44:19 · 2628 阅读 · 0 评论 -
算法导论KRUSKAL算法原理及其实现
KruskalKruskalKruskal算法又称作为克鲁斯卡尔算法,是基于贪心的一种最小生成树算法,根据前两部分了解到的安全边规则与不相交集合的数据结构(并查集),即可实现该算法的内容:KruskalKruskalKruskal方法的中心思想是在图中寻找一条权重最小的连接两个不相交集合的边即为所寻找的安全边。可以理解为找的边(u,v)(u,v)(u,v)符合横向切割的轻量级边的要求且一定尊重某最小生成树集合AAA,是否尊重节点uuu代表的或者节点vvv代表的某棵正在发现过程中的最小生成树集合很容易。原创 2022-04-09 10:29:32 · 629 阅读 · 0 评论 -
算法导论21章路径压缩的按秩合并并查集原理实现
不相交集合的数据结构定义:将集合AAA分成一些非空子集,每个子集称为一个类,且AAA中每个元素仅属于一个类。则称这些类的全体为集合AAA的一个分类,也称AAA的一个分划。从近世代数描述分类的定义中进行实例化,可以看到不相交集合的影子,其中集合AAA维护的关系为集合森林的强连通分量子集,每个节点仅属于一个连通分量的分类中。针对上述不相交集合,初始化为均是单个节点的森林,所以实现其他连通分集合的操作有三种:Make-set(x):初始化新的集合,该集合只包含x;Union(x,y):将两个连通集原创 2022-04-06 23:30:02 · 769 阅读 · 0 评论 -
算法导论最小生成树安全边规则
最小生成树证明最小生成树(Minimum Spanning Trees)表示的问题抽象后更多的是在联通无向图G=(V,E)G=(V,E)G=(V,E)中,寻找∣V∣−1|V|-1∣V∣−1条边的集合T⊆ET\subseteq ET⊆E使得在新图GT=(V,T)G^T=(V,T)GT=(V,T)为一个联通无向图且边权之和w(T)=∑(u,v)∈Tw(u,v)w(T)=\sum_{(u, v) \in T} w(u, v)w(T)=∑(u,v)∈Tw(u,v)最小。换句话说就是寻找∣V∣−1|V|-1∣V原创 2022-04-03 23:52:41 · 1282 阅读 · 0 评论 -
c++算法导论原理实现拓扑排序与强连通分量并证明
拓扑排序对于有向无环图G=(V,E)G=(V,E)G=(V,E),拓扑排序的效果是将所有顶点集合进行线性排序,排序与数据的大小排序不同,拓扑排序更多的是依赖于节点间的方向关系,或者解释为是“先有鸡还是先有蛋”的故事,将蛋生鸡,鸡生蛋这种拓扑的顺序结构转变为线性结构“就是“蛋变成鸡”这种排序效果,更多的可能会应用到工程流程上或是其他领域。上述举得例子不合理因为针对有向无环图,图中存在环则意味着无法找到一个不被依赖的节点提取出来,所以”蛋变成鸡“这种线性结果是存在矛盾的。上述拓扑图是书中的例子,描述的是原创 2022-03-31 20:36:05 · 1181 阅读 · 0 评论 -
[CLRS Chapter22]基本的图算法Ⅱ深度优先搜索原理角度实现&性质证明(括号化定理、白色路径定理)
广度优先树首先给定图GGG和目标搜索点sss的情况下,定义前驱子图Gπ=(Vπ,Eπ)G_\pi=(V_\pi,E_\pi)Gπ=(Vπ,Eπ),其中点集Vπ={v∈V∣v.π≠NIL}⋃{s}V_\pi=\{v\in V|v.\pi\ne NIL\}\bigcup\{s\}Vπ={v∈V∣v.π=NIL}⋃{s},Eπ={(v.π,v)∣v∈V−{s}}E_\pi=\{(v.\pi,v)|v\in V-\{s\}\}Eπ={(v.π,v)∣v∈V−{s}}。可以看出前驱子图表达的是由目.原创 2022-03-29 22:50:13 · 606 阅读 · 0 评论 -
[CLRS Chapter22]基本的图算法Ⅰ(从算法导论原理c++实现算法)
书中在第二十二章图的基本算法中主要提到了以下几个部分:图的表示BFSDFS拓扑排序强连通分量相关算法题目的语言实现操作这里不做阐述,主要实现书中提到的伪代码实现与证明过程:图的表示对于G=(V,E)G=(V,E)G=(V,E)主要针对点集为VVV,边集为EEE的有向图和无向图,其中两种标准的方法是邻接链表和邻接矩阵:邻接矩阵可以看作是空间复杂度为O(V×V)O(V\times V)O(V×V)的01矩阵,当边带权重时则矩阵内部的信息会出现边权取代01值;邻接链表通过链表方式记录每原创 2022-03-27 22:00:40 · 1391 阅读 · 0 评论 -
图论算法中存图的方法
邻接矩阵&&邻接表存图邻接矩阵用二维数组直接存//存n*m的图for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { //要存的数据 }邻接矩阵add(x,y,z)代表(始点,终点,边权)tot意思是第几组信息(信息就是指一套(x,y,z))ver是指向终点的指针列表...原创 2019-11-10 19:48:05 · 205 阅读 · 0 评论 -
洛谷P2384 最短路(dijkstra+priority_queue)
最短路模板(改)将路线缩小的加法改成乘法,距离数组初始量设为1#include<bits/stdc++.h>using namespace std;int edge[1000005],ver[1000005],head[1000005],Next[1000005],d[1000005];int m,n,tot;bool v[1000005];int mod=9987,an...原创 2019-08-09 13:44:39 · 224 阅读 · 0 评论