数据结构c++
De_hua_1
菜鸡本鸡
展开
-
强连通分量之Kosaraju算法
今天学习了强连通分量的Kosaraju算法,网上写的人也不多,但是跟着视频教程讲解,还有去网上搜了博客,感觉他们的讲解都存在一定的问题,我在学习的时候碰到的一些困惑,他们并没有讲的清楚明白,当然,他们说的大致的思路是正确的。算法思想:先说说什么是强连通分量强连通分量是针对有向图定义的,为了区别无向图的联通分量的概念。在一个强连通分量中,任意两点都相互可达。这个图中就存在三个强连通分量,分...原创 2020-02-09 18:41:14 · 591 阅读 · 0 评论 -
Kosaraju算法
//有向图的强连通分量/* 强连通分量 再一个强连通分量中,任何两点都可达 将所有的强连通分量看作一个点 得到的所有有向图一定是DAG(有向无环图) 如果存在环的话,那么这个环上的节点必然能够组成强连通分量 */ #include<vector>#include<iostream>#include<stdlib.h>#inclu...原创 2020-02-09 18:40:15 · 189 阅读 · 0 评论 -
Dijkstras算法
最短路径之Dijkstras算法算法思路: 算法核心操作是松弛操作 **松弛操作:**不记住这名字其实也是可以的,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZAM3tcC-1580967953420)(C:\Users\zmh\AppData\Roaming\Typora\typora-user-images\image-202002061125...原创 2020-02-06 13:46:57 · 151 阅读 · 0 评论 -
STL 之 pair
pair转载 2020-02-05 21:34:11 · 84 阅读 · 0 评论 -
最小生成树之Kruskal算法
最小生成树之Kruskal算法,其核心原理也是切分定理切分定理:切分把图中的节点分为两部分,称为一个切分(Cut);横切边如果一个边的两个端点,属于切分(Cut)不同的两边,这个边称为横切边(Crossing Edge);切分定理给定任意切分,横切边中权值最小的边必然属于最小生成树;Kruskal算法属于切分定理的逆向应用。首先将所有的边按从小到大进行排序。选出最短的边。此...原创 2020-02-05 16:24:33 · 308 阅读 · 0 评论 -
Kruskal
//最小生成树 /*算法思想: 尽量使用短边 Kruskal算法 贪心算法 切分定理 : 图中的顶点分为两部分 就称为一个切分 如果一个边的两个端点,属于切分不同的两边,这个边 称为横切边 二分图:找到一组切分,使得所有的边都是横切边 切分定理: 横切边中的最短边,属于最小生成树 Kruskal算法每次选择一个最短边,如果这个边没有形成环 */ ...原创 2020-02-05 16:23:58 · 224 阅读 · 0 评论 -
最小生成树之Prime算法
Prime算法是解决最小生成树的一个算法。不管是Kruskal算法还是Prime算法去,其核心都是切分定理。切分定理:切分把图中的节点分为两部分,称为一个切分(Cut);横切边如果一个边的两个端点,属于切分(Cut)不同的两边,这个边称为横切边(Crossing Edge);切分定理给定任意切分,横切边中权值最小的边必然属于最小生成树;切分定理的证明可使用反正法,这里不给出证明,...原创 2020-02-05 15:08:28 · 1264 阅读 · 0 评论 -
Prime
//Prime算法/*在求解最小生成树的问题中,不管是Prime算法还是Kruskal算法,都需要了解切割定理,因为这两个算法的核心思想都利用了切割定理切割定理 */ #include <queue>#include<iostream>#include<stdlib.h>#include<map>#include<fstre...原创 2020-02-05 15:07:47 · 241 阅读 · 0 评论 -
STL set/multset/map
https://www.cnblogs.com/yongqiang/p/5746754.html转载 2020-02-04 20:40:48 · 126 阅读 · 0 评论 -
并查集(C++实现)
由于我使用并查集来解决Kruskal算法(最小生成树),至于并查集的定义我并不是特别熟悉,看下面的并查集的实现过程应该对并查集有所了解。并查集在Kruskal中的作用, 用来判断某两个顶点连接起来判断这棵树是否构成环。并查集讲解。下面是我自己用C++将并查集封装成一个类。#include<iostream>#define max 10using namespace std;...原创 2020-02-04 17:27:44 · 195 阅读 · 0 评论 -
优先队列(堆)
在最小生成树的算法中,用Kruskal算法和Prime算法来解决,其中Kruskal算法会用到并查集这个数据结构,而并查集在任何一种语言中都没有现成的以实现好的结构,在Prime中会用到最小堆也就是优先队列,恰好STL中有实现这个这个数据结构。头文件:#include优先队列的三种声明方式1.一般声明方式priority_queue<int> a; //通过操作,按照元素从大到...原创 2020-02-04 13:16:46 · 152 阅读 · 0 评论 -
C++BFS和DFS的共同的应用(无向图)
深度优先遍历的应用:1.求联通分量2.路径问题 1)单源路径2)点到点路径(递归改进)3.环检测(递归改进)4.二分图检测原创 2020-02-03 10:57:26 · 608 阅读 · 0 评论 -
刷题时对时间复杂度的控制
今天在做leetcode752 题时遇到一个问题:题目中要求在vector找出其中的一个元素,此时需要遍历vector,如果这个语句被执行很多次,那么时间复杂度为N,和其他的代码结合起来时间复杂度会上升一个量级。这个量级已经直接让我的leetcode上的题超出限制时间了。而且只是在数量不大的第一个例子就报红。解决办法:将题目所给的vector转储到set中,用set.find()来查找某个元...原创 2020-01-30 23:19:22 · 132 阅读 · 0 评论 -
将图的顶点二维坐标转换为一维索引(图模型的建立)
参照leetcode 695题给定一个二维数组,a[i][j] == 1 (无向图)即为顶点,该顶点的坐标为 (i,j)。注意这里给定的矩阵不是邻接矩阵,这个矩阵给出的信息是顶点的坐标位置。在进行图的遍历时1.若要直接使用该矩阵,则在遍历时,从一个顶点到下一个顶点的操作需要注意2.可将该矩阵转换为邻接表,邻接表作为遍历时的数据结构我们比较熟悉。下面介绍如何将这个矩阵转化为邻接表。在C...原创 2020-01-29 13:16:47 · 2440 阅读 · 0 评论 -
C++ 如何读和写txt文件中的数据
https://blog.csdn.net/qq_34097715/article/details/79970860转载 2020-01-26 20:36:28 · 650 阅读 · 0 评论 -
图的三种表示方法 邻接矩阵,邻接表,邻接表改进版 及其优劣分析(附代码)
图有三种表示方法:**1.邻接矩阵:**利用一个n*n大小的方阵,A[i][j] = 1表示顶点 i 和 j 是相邻的,即 i 和 j 之间有一条边A[i][j] = 0表示顶点 i 和 j 是不相邻的,即 i 和 j 之间有没有边...原创 2020-01-23 22:55:00 · 1051 阅读 · 0 评论 -
c++ new的使用与struct与STL嵌套中的应用
先简单介绍下new的使用int *a = new int[5];new int[5] 仅仅分配了空间class A {A(){};} //声明一个类 AA *obj = new A(); //使用 new 创建对象delete []a;delete obj;但是 new A(),不仅仅为对象obj在队上分配了空间, 而且还调用了 A的构造函数,生成了这个对象。所以 new...原创 2020-01-23 21:16:59 · 667 阅读 · 0 评论