图论初赛前刘老师草草地过了一遍,那时听得比较迷糊。复赛后详详细细地学习了图论,理解较为深入了一些。
图论比较重要的内容分为:dfs/bfs遍历,最短路,生成树,割点割边强连通分量,欧拉回路。
图的存储结构:邻接矩阵,邻接表,边表。
邻接矩阵书写较为方便,但是寻找邻接点的速度较慢,适用于点数小于5000的图。
邻接表寻找邻接点速度快,适用于点数大于5000的图。(无向图中边表要乘2)
边表只是单纯的记录边的信息,适用于稀疏图。
对于遍历:dfs可以用来判断环。
最短路又分为floyed算法,dijkstra算法,bellman-ford算法,spfa算法,拓扑排序。
floyed算法: 适用于求任意两点间的最短路径。
dijkstra算法: 单源点的最短路径,但是图中不能有负权回路。
bellman-ford算法: 解决了dijkstra算法不能有负环的问题,用于判断负环和单源点最短路径。
spfa算法: 对bellman-ford算法的优化,效率更高。
拓扑排序:对有向无环图中的点进行排序可以用队列和堆进行维护,堆的效率更高。
比较时间复杂度:dijkstra比较稳定,spfa不稳定。对于稠密图,dijkstra较为稳定。对于稀疏图,spfa是个不错的选择。
生成树(n个点,n-1条边)分为最小生成树和最大生成树(最大生成树是最小生成树的变形):prim算法和kruskal算法。
prim算法利用生成树的剪切属性,kruskal算法则是用并查集来维护。
整理得比较简略,作为复习提纲。