一,最短路问题,
(一)迪杰斯特拉优先队列优化nlogn,注意要把编号和距离开结构体压入队列中,要把建反向边的思想牢记在脑子里;不能解决负环。
(二)弗洛伊德算法,对于500以内的数据可以直接用它暴力求解,还可以判断连通性问题,n三方。
(三)spfa,尽量用弗洛伊德替代,大佬都这么说,我也不知道为什么,可以解决负环问题,入队3*n时可以结束。
二,最小生成树,
(一)克鲁斯卡尔算法(边集储存)和prim算法(邻接矩阵储存)。
(二)倍增算法求LCA,并维护最值,dfs完成;(同时复习。RMQ求区间最值)。
三,树链剖分,
(一)dfs1,求出size(包括自己),找到自己的重儿子;
(二)dfs2,先对重儿子进行编号,记录新编号和原编号的关系,记录每一个节点的top值;
(三)用线段树位置区间,记得数组要开到原来的四倍!!。
(四)记得访问线段树的时候,访问的是新的编号。
(五)边权下放的情况,当top相等的时候,编号较小的那个点不算(因为记录的上一条边)。
(六)用剖分求LCA。
(七)每一条重链编号连续,每一个根节点及其子树编号连续。
四,二分图(这个应该不是特别重要)
(一)最大匹配(匹配最多),完美匹配(每个点匹配完),完备匹配的概念(其中一个集合匹配完;
(二)判断是否为二分图,bfs染色法,选任意节点编号为0,对儿子节点依次++,最后遍历,同一条边的两个节点的奇偶性,奇环不可能是二分图。
(三)匈牙利算法求最大匹配(增广路径),遍历每一个x集合节点,找每一个它的邻接点,若没有匹配则返回true,并进行新的匹配,若已匹配,这对它的匹配点进行同样的递归操作。
(四)最小点覆盖=最大匹配,最小边覆盖=节点数-最大匹配数。
五,图的连通性问题
(一)无向图求割点和割边(tarjan),对于割点low[k]>=dfn[x],根节点要单独判断,如果根节点儿子数=1则不是割点!!对于割边,low[k]>dfn[x]。
(二)点双连通分量,当low[k]>=dfn[x]时进行出栈,注意自己不要出栈,进行单独处理,因为一个点会同时出现在多个点连通分量(它一定是割点)。
(三)边双连通分量,第一遍dfs求出所有割边,第二次dfs遍历每一条边,割边两边的编号++。
(四)添加多少条边变成边双,缩点后求出叶子节点,ans=(叶子+1)/2。
(五)有向图的强连通分量,当儿子节点访问完后,判断low[x]是否等于dfn[x]。
(六)添加多少条边能变成强连通图,缩点,求如度为0和出度为0的节点数,ans=max(ru,chu)。注意当连通分量为1的时候ans=0,需要进行特判。
详细代码见课件
来源:https://blog.csdn.net/qq_45516411/article/details/102760733