随笔分类 - 搜索与图论
包括DFS,BFS,树与图的深度优先遍历,树与图的广度优先遍历,拓扑排序,Dijkstra,bellman-ford,spfa,Floyd,Prim,Kruskal,染色法判定二分图,匈牙利算法等内容。
摘要:AcWing861.二分图的最大匹配 题解 匈牙利算法:若该左点匹配到的右点之前已匹配到了左点,则查找该之前匹配的左点可否换一个点,使新的左点能匹配该右点 #include <iostream> #include <cstring> #include <cstdio> using namespace
阅读全文
摘要:AcWing860.染色法判定二分图 题解 若出现奇数环,染色一定矛盾 当前点没有染色,就染色包括其子节点 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 1e5
阅读全文
摘要:AcWing859.Kruskal算法求最小生成树 题解 可以通过并查集查看a,b的根结点是否相同,相同则代表连通,即会成环不能加入最小生成树 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm>
阅读全文
摘要:AcWing858.Prim算法求最小生成树 题解 [注:先累加再更新防止自环使得dist[j]变小(自环为负数dist[j] = min(dist[j], gt][j]),j==t Prim的思路就是每次找出距离最近的点,再用距离最近的点更新其他点使其变得更近,寻得n-1条边成为最小生成树 #in
阅读全文
摘要:二分图:所有点可以划分为两个集合,两个集合中的点存在相连边,而集合内部的点不存在相连的边,故不能含有奇数环,不然会导致某个点无法划分到这两个集合中 题目 朴素Prim:AcWing858.Prim算法求最小生成树 Kruskal:AcWing859.Kruskal算法求最小生成树 染色法判断二分图:
阅读全文
摘要:AcWing854.Floyd求最短路 题解 注意:k, i, j的顺序不能改变,必须以k作为桥梁 #include <iostream> #include <cstring> using namespace std; const int N = 210; int g[N][N], n, m, k;
阅读全文
摘要:AcWing852.spfa判断负环 题解 判断负环的思路:利用抽屉原理,当边数为n时,若要连成一条无环的直线我们需要n+1个点,但我们只有n个点,故可以判断出存在环。 且由于spfa更新路径的特性,代表这个环会使得路径变小,即这个环为负权环 #include <iostream> #include
阅读全文
摘要:AcWing851.spfa求最短路 题解 spfa算法即为Bellman-Ford的优化,只有每次dist[a]发生了变化才需要更新对应的dist[b],通过此减少循环次数 #include <iostream> #include <cstring> #include <queue> using
阅读全文
摘要:AcWing853.有边数限制的最短路 题解 存在负权回路可能会导致无法求最短路,比如说图中 2的自环,没转一圈距离-1,我们求1到5的距离可以转无穷圈2,即1到2的距离为 -无穷 循环n次求的是长度不超过n条边的最短路 #include <iostream> #include <cstring>
阅读全文
摘要:AcWing850.Dijkstra求最短路 II 题解 #include <iostream> #include <cstring> #include <queue> #include <vector> using namespace std; const int N = 1e6 + 10; ty
阅读全文
摘要:详解 规定n为点数, m为边数 稀疏图用堆优化Dijkstra, 稠密图用朴素Dijkstra 题目 朴素Dijkstra:AcWing849.Dijkstra求最短路 I 堆优化Dijkstra:AcWing850.Dijkstra求最短路 II bellman-ford:AcWing853.有边
阅读全文
摘要:AcWing849.Dijkstra求最短路 I 题解 注意:本题存在重边,故g[x][y] = min(g[x][y], z); #include <iostream> #include <cstdio> #include <cstring> using namespace std; const
阅读全文
摘要:AcWing848.有向图的拓扑序列 题解 额外知识:有向无环图必然有拓扑序列 将入度为0的点放入队列,再逐一拿出,那些以此点为入度的点减1,若有新的入度为0则放入队列。 #include <iostream> #include <cstdio> #include <cstring> using n
阅读全文
摘要:AcWing845.八数码 题解 还是一道bfs标准题,每次存入4个方向的状态,直到找到最终状态 #include <iostream> #include <cstdio> #include <unordered_map> #include <queue> using namespace std;
阅读全文
摘要:AcWing847.图中点的层次 题解 #include <iostream> #include <cstring> #include <queue> #include <cstdio> using namespace std; const int N = 1e5 + 10; int n, m; q
阅读全文
摘要:AcWing846.树的重心 题解 树的深度优先遍历:可以算出各子树的结点数 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N = 1e5 + 10; int ans =
阅读全文
摘要:AcWing844.走迷宫 题解 stl #include <iostream> #include <cstring> #include <queue> using namespace std; typedef pair<int,int> PII; const int N = 110; queue<
阅读全文
摘要:AcWing843.n-皇后问题 题解 解法一:对每一行进行遍历,因为皇后不在同一列,故每一行取不同列(列行转换同理) #include <iostream> #include <cstdio> //对每一行进行遍历,由于皇后不能在同一列,故每一行的摆放列都不同 using namespace st
阅读全文
摘要:AcWing842.排列数字 题解 #include <iostream> using namespace std; const int N = 10; bool vis[N]; int nums[N], n; void dfs(int u) { if(u == n + 1) { for(int i
阅读全文