写在前面
好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文。
笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用。但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础算法不过关导致写出的代码运行速度很慢,因此很苦恼。所以决定这个暑假补习一下基础算法,主要是刷一些简单的ACM入门题。偶尔会发一些刷题笔记(偶尔!)。和作者有类似目标的同学可以一起交流共勉!
目前在看的教程:
北京理工大学ACM冬季培训课程
算法竞赛入门经典/刘汝佳编著.-2版可以在这里下载->github
课程刷题点
Virtual Judge
刷题代码都会放在github上,欢迎一起学习进步!
因为很多原因,北理的课程我打算暂时刷到这里,今天会做最后一期笔记。ACM的相关内容如果继续刷,主要会看紫书。或许以后会刷下力扣。暑假这三个多星期左右的训练让我感受颇多,对ACM和算法了解了更多。期待下一次的刷题特训。
并查集
解决方法:
- 图染色,合并复杂度高,查询O(1);
- 并查集;
概念
实现
- 数组实现
建立标记数组father,用father[]表示元素i所属集合(头目)的标记。
看到这里突然感觉和Dijkstra记录路径的方法类似
优化
对整体数据结构的优化,在find函数中优化。
树状结构可能变成线状结构。
一般写递归即可。复杂度log级。
变种
最小生成树
kruskal算法
实现
使用路径压缩,平均复杂度ElogE
prim算法
用的不多。和Dijkstra有点像。