摘要: Floyd算法可以求出图中任意两点间的最短路,而且边权可为负。Floyd算法是利用了动态规划的思想,通过枚举路径上的点来更新最短路。 可以看出复杂度是O(n^3)的,当数据规模超过500就有可能超时了。但需要注意,没有直接相连的点之间的最短路需要初始化为inf,而inf的选择要保证足够大又不能溢出, 阅读全文
posted @ 2018-08-18 21:57 Mr^Kevin 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 图的存储方式有邻接矩阵和邻接链表。 邻接矩阵就是开一个二维数组来表示图上两个点之间的连边情况,比较简单,也有弊端,当图比较稀疏时,也就是边数相对少时,会造成大量的空间浪费。 邻接链表也并不复杂,但具体实现方式有很多,下面的代码只是其中一种,还可以使用二维vector,来保存与点相连的边。 阅读全文
posted @ 2018-08-18 20:02 Mr^Kevin 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 对于一个有序的序列,可以用二分查找的方式快速找到某一元素。顾名思义,二分查找就是利用二分的思想,通过将要查找的元素与区间中点值比较,大体确定元素位置,舍弃一半的元素,因此效率很高。 c++ STL库中提供了这类函数:lower_bound和upper_bound。其中lower_bound是返回有序 阅读全文
posted @ 2018-08-18 18:15 Mr^Kevin 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 对于一个无序的序列,找出其中第k大的数,你会怎么做呢?一个容易想到的做法是,先将原序列按降序排序,再输出第k个元素。这种做法是正确的,只不过在数据范围较大时不太适用,主要是因为排序算法一般选择快排之类的,复杂度是O(nlogn)。那么有没有更优秀的方法呢?是有的,而且思想和快排相似。不妨回忆一下快排 阅读全文
posted @ 2018-08-18 17:36 Mr^Kevin 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 归并排序体现了分治思想,时间复杂度是O(nlogn),空间复杂度是O(n)。 归并排序是将序列不断二分,最终分成单个元素,再两两合并,最终达到整个序列有序。 1 void msort(int l,int r) { 2 if(l==r) return; //划分到单个元素就返回 3 int m=l+( 阅读全文
posted @ 2018-08-18 16:08 Mr^Kevin 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 其实对于c++选手来说,快速排序即使没有掌握,也可以使用STL库中的sort函数。但仔细学习一下快速排序还是很有必要的,不光是由此演化的快速选择算法,快排的种种优化也可以锻炼能力。 快排的思想很简单,就是选取序列中任意一个元素为基准,将序列划分成两部分,序列左边都比基准小,右边都比基准大,也就是找到 阅读全文
posted @ 2018-08-18 11:20 Mr^Kevin 阅读(302) 评论(0) 推荐(0) 编辑