acwing 算法基础班学习笔记-第三讲.搜索和图论

一、DFS
深度优先遍历,需要维护一个st数组来表示每个节点是否被访问过,若不止一条路径则还需要恢复st数组的值(恢复状态)。剪枝:当遍历除了节点是否被访问以外还有其他条件时,可同时判断条件是否成立和节点是否被访问,若不成立则跳过该节点,最后只返回走到终点的路径。

树和图的深度优先遍历问题:
树的重心。可用节点的子节点个数s代表一个子连通分量,n-s代表除去这个节点和其子节点外其他所有节点的个数,迭代更新。

二、BFS
广度优先遍历,将每次可操作的状态压入队列,若队列非空则访问队头元素,距离+1。注意八数码问题的解决方式:将二维的状态转移成一维字符串的状态。

树和图的广度优先遍历问题:点的层次(最短路问题)。

三、拓扑排序
采用bfs处理,将入度为0的节点压入队列,每次访问时将指向的节点的入度-1,若入度为0则压入队列。

四、最短路问题:
1.单源最短路问题
1.1 无负权边
1.1.1 dijkstra算法 O(n²)
1.1.2 dijkstra 堆优化版 O(mlogn)
1.2 有负权边
1.2.1 bellmen-ford 算法 O(nm)
1.2.2 SPFA算法 最坏O(nm) 一般O(m)(推荐单源用这个)
2.多源汇最短路问题
floyd算法 O(n³)

1.1迪杰斯特拉算法:一种贪心的做法,每次找到当前能够到达的最近的点,标记为已确认最短路径点,用这个点来更新源点到其他点的最短路径。
堆优化版:用一个单调队列来维护未确认最短路径的能够到达的最近的点,每次弹出队头元素,标记该点,然后用该点更新到其他点的距离,将新的点和距离压入单调队列(会造成冗余信息)。适合稀疏图。

1.2.1 bellmen-ford算法:擅长解决有边数限制的最短路问题,核心思想是松弛操作,即
for n-1次
for 所有边 a,b,w (松弛操作)
dist[b] = min(dist[b],back[a] + w)
若循环n次还能更新,说明存在负环(可用来判断图中是否存在负环,但效率较低,一般用SPFA判断)注意松弛操作使用的是上一轮迭代完成后的dist数组(back),因为这一轮dist还会更新,如果用更新过的dist再去更新可能会超过边数限制。

1.2.2 SPFA算法:bellman-ford算法的一个优化,事实上不用遍历所有边,只用遍历到源点距离变小的点的边即可,当且仅当一个点的前驱节点更新了,我们才用更新这个节点。即用一个队列来存放待更新的节点,用st来维护节点是否在队中的信息,节点可以反复入队,每次用队头节点的边来更新其他点到源点的最小距离,若有节点更新了,则判断该节点是否在队中,若不在则将其入队。若有负环队列会有源源不断的节点导致无法结束进程。判断负环有两种方法:
方法 1:统计每个点入队的次数,如果某个点入队n次,则说明存在负环。
方法 2:统计当前每个点的最短路中所包含的边数,如果某点的最短路所包含的边数大于等于n,则也说明存在负环。

2.floyid算法:基于动态规划的思想:三重循环
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
初始d为图的邻接矩阵。
用点k(逐次递增)去更新其他所有边。f[i, j, k]表示从i走到j的路径上除i和j点外只经过1到k的点的所有路径的最短距离。那么f[i, j, k] = min(f[i, j, k - 1), f[i, k, k - 1] + f[k, j, k - 1]。
因此在计算第k层的f[i, j]的时候必须先将第k - 1层的所有状态计算出来,所以需要把k放在最外层。

五、最小生成树
1.prim算法:基于点,每次找到与当前点集最近且不输入集合中的点,将其加入集合,后更新到集合外的点的距离。
2.kruskal算法:基于边,每次找到边权值最小的两个点,若两端点不在一个集合内,则将两个点合并为一个集合(采用单调队列和并查集实现)。

六、染色法判定二分图
二分图:当且仅当图中不含有奇数环,此时图中所有点可以分为两个集合,所有边都在集合中间,集合内部没有边。
利用dfs将每个点染色,当两个连接点的颜色相同时则返回false,说明此图不是二分图,若dfs遍历完还没有失败说明是二分图。

七、匈牙利算法
解决二分图的最大匹配个数(任意两边都没有公共定点的最大边的个数)。
用st来维护一轮模拟匹配中右集合中的点是否匹配的信息。依次遍历左集合的点,根据点的边找到右集合的点,若右集合的点的st为false,则将该点置为true,若这个点没有匹配或者它匹配的点能够找到其他尚未匹配的点,则匹配成功,将这个点分配给它。

你可能感兴趣的:(图论,算法,学习)