本篇文章仅供个人复习,因此以自己理解为首要目标,新人不懂勿喷,感谢。</blockquote>学了半天,吭哧吭哧的,终于学到图论啦。。。
一、引言
图论是组合数学中的一个分支,是组合数学中一颗璀璨的明珠。无论是在数学研究和计算机科学中都有着广泛的应用。图这个东西,说简单不简单,说难也确实不难。虽然有些知识可能有些晦涩,但只要理解透彻,搞清算法的详细意义,就能茅塞顿开。
二、图的基本概念
一般的算法书以及老师都会介绍。如果实在不懂,买本书,或者学会善用搜索引擎。
基本概念:无向图、有向图、完全图、连通图、稠密图、稀疏图、边权、权值、连通分量等三、图的存储
对于图论知识的理解,一定是一个从具体到抽象的过程。如果真的理解不了,就把图画出来吧。
比如我们考察下面这个无向图(用什么软件画好呢?想了半天决定用OneNote):
图有邻接矩阵和邻接表两种存储方法。
邻接矩阵就是考察每两点连线,然后运用二维数组存储这个连线的边权。比如上图中1号点到2号点连线的边权是10,则我们的二维数组a[1][2]=10. 以此类推。
邻接表的特点则是省空间,用链表存储节点之间的关系。
四、Prim算法求解最小生成树
核心:建立在邻接表的基础之上,然后……其实就是暴力啦
朴素实现:
1 |
|
优化:
在找最小值的时候,能不能再降一些复杂度呢?由此我们想到了堆结构(跟线段树非常非常相似)。下面是优化后的代码。
1 |
#include <iostream> |
五、Kruskal算法求解最小生成树
核心:在邻接表的基础之上,跑并查集。
下面看一下代码实现。
1 |
|
六、结语
由于最小生成树是一类题目,因此AC掉模板题至关重要。
Luogu的数据好像很水的样子,暴力都可以轻松过掉。
不过LOJ好像就不行了,Luogu AC代码交上去只得10分。
总之就是学习完新知识后要及时复习总结,上课讲的理论下课后一定要手动实现,重要的部分尤其是解题思路、算法复杂度和证明方法一定要记下来。这样可以避免出现遗忘现象。
“同学,这个学过吗?”
“学过啊!”“来写一个我看看。”
“我……我不会啊!怎么写来着。。。”
要上考场了还像上面这样,就彻底凉了。




近期评论