![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
Wanstin
love and share
展开
-
Dijkstra算法的多种写法
Dijkstra算法策略: 设置集合S存放已被访问的顶点,V-S存放图中所有顶点,然后执行n次以下操作: 从集合V-S中选择与起点s距离最小的的一个顶点(记做u),访问并加入集合S。 令顶点u为中介点,优化(更新)起点s与所有从u能到达的顶点v之间的最短距离。 邻接矩阵实现: 邻接矩阵版适合初学者练手,熟悉dijkstra算法的思想,同时对图的顶点数量也有要求(一般不超过1000,空间...原创 2020-04-10 22:07:11 · 603 阅读 · 0 评论 -
约瑟夫环
题意: n 个人围成一圈,从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。 1.队列模拟 用(循环)队列模拟约瑟夫环的跳步过程,先定义一个队列(STL库<queue>),将元素按顺序读入,定义一个步长变量step,初始化为1,然后只要队列不为空,就开始跳步: 先判断st...原创 2020-03-15 22:56:30 · 572 阅读 · 0 评论 -
并查集
概念: 并查集是一种树型的高级数据结构,主要用于处理不相交集合的合并及查询问题。顾名思义,并查集有两个重要的操作:合并和查询。一般用来判断两个元素是否属于同一个集合,我们只需让同一个集合中的所有元素都拥有一个祖先,后面判断这两个元素的祖先是否是同一个即可判断它们是否属于同一集合。 过程: 初始化:将每个元素的父亲都设为其本身。 合并:先查询这两个元素的父亲,如果不属于同一个集合,将这两个集合...原创 2020-03-12 23:10:53 · 451 阅读 · 0 评论 -
二分查找(Binary Search)
概念:在一个有序的序列中,通过每次与中间元素比较,来缩小查找范围,找到待查找的元素位置的方法。这样每次可以过滤掉一半的数据,最坏的情况下只需要logn次(n为序列的元素总数)就能找到元素,因此二分查找的时间复杂度为:O(logn);是常用的一种效率较高的查找方法,代码如下: const int maxn=1e6+10; int num[maxn]; int n,m; int Binary_Sea...原创 2020-03-10 20:43:34 · 530 阅读 · 0 评论 -
埃氏筛与欧拉筛
1.埃氏筛 思想:任意合数都可以表示成几个素数的乘积,那么我们可以每找到一个素数,就将他的倍数都标记(代表这个数是合数)。2是最小的素数,所以我们从2开始标记。时间复杂度为:O(n*logn) 代码如下: const int maxn=1e5+10; bool flag[maxn]; int prime[maxn]; int pri_cnt=0; void get_prime(int n){ f...原创 2020-03-09 23:13:15 · 435 阅读 · 0 评论 -
pat 任务调度的合理性 ——拓扑排序
拓扑排序概念:在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。 过程:先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度-1。重复此过程直至所有节点都被分离出来。 PS:如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况 。 搞懂拓扑排序后,这个题目就是个模板题,代码如下: #include...原创 2020-03-05 20:39:09 · 376 阅读 · 0 评论 -
入门级的三种排序算法(比较,冒泡,快排)详讲
1. 比较排序 比较排序是小白最容易想到的排序方法,从第一个元素开始,和后面所有元素依次进行比较,比第一个元素小,就将这两个元素交换,最后比完第一轮,第一个元素肯定是最小的了,然后从第二个元素开始,和后面所有元素比较,一轮比完,第二个元素是第二小的,同理,比完n-1(n为数组元素个数)轮,数组全部变得有序。比较排序是稳定的,也就是遇到值一样大的情况下不会发生交换,保持原来位置,其时间复杂度为O...原创 2020-03-05 20:26:22 · 752 阅读 · 0 评论