第三章 搜索与图论
记录在acwing算法基础课的搜索与图论专题,方便后续复习
MangataTS
一个爱折腾的Coder
展开
-
AcWing 861. 二分图的最大匹配(匈牙利算法)
题目连接 https://www.acwing.com/problem/content/863/ 思路 我们选择左半边或者右半边作为枚举点,然后对于当前的位置做一次判断如果当前位置的第一条边的女生已经匹配成功了,那么我们就看这个女生的男生还能不能再换一个人,如果能换的话,直接换掉就好了,否则当前男生就看下一个女生,以此类推,最后每成功匹配一个男生就让贡献自增 代码 #include<bits/stdc++.h> using namespace std; const int N = 5e2+10原创 2022-02-10 11:38:02 · 151 阅读 · 0 评论 -
AcWing 860. 染色法判定二分图(染色法)
题目连接 https://www.acwing.com/problem/content/862/ 思路 我们对每一个节点进行染色操作,我们需要注意的是我们染色后要将当前节点的所有相邻节点全部染成另一种颜色,如果出现颜色相同的情况,那么就说明产生了奇数边的环,也就说明不存在二分图 代码 代码一 #include<bits/stdc++.h> using namespace std; const int N = 1e5+10; vector<int> V[N]; int vis[N];原创 2022-02-10 11:36:57 · 196 阅读 · 0 评论 -
AcWing 859. Kruskal算法求最小生成树(稀疏图)
题面连接 https://www.acwing.com/problem/content/861/ 思路 没啥好说的,就是贪心+破圈法,然后不断将最短的边加入集合中,可以参考我这篇博客 https://acmer.blog.csdn.net/article/details/118560004 代码 #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define N 1原创 2022-02-10 11:33:33 · 179 阅读 · 0 评论 -
AcWing 858. Prim算法求最小生成树(稠密图)
题目链接 https://www.acwing.com/problem/content/description/860/ 思路 prim算法的思想就是,我们维护一个最优集合,然后寻找所有不在集合的点连向集合的最短边,然后将这个点加入集合,并将权值加入总权值中,对于每一个最短边的点,我们用该点更新一下其他点到集合的距离就好了(这里和迪杰斯特拉不太一样,迪杰斯特拉是更新下一个点到源点的距离,而这里是更新没在集合中的点到集合的距离) 代码 #include<bits/stdc++.h> using n原创 2022-02-10 11:32:42 · 283 阅读 · 0 评论 -
AcWing 854. Floyd求最短路(模板)
题目链接 https://www.acwing.com/problem/content/856/ 思路 我们用d[k][i][j]来表示经过前k个点中,或者说以前k个点作为中转更新从i到j最短路,那么我们就能得到一个状态转移方程 d[k][i][j]=min(d[k−1][i][j],d[k−1][i][k]+d[k−1][k][j])d[k][i][j] = min(d[k-1][i][j],d[k-1][i][k] + d[k-1][k][j])d[k][i][j]=min(d[k−1][i][j],d原创 2022-02-10 11:25:35 · 222 阅读 · 0 评论 -
AcWing 852. spfa判断负环(spfa or bellman)
题目链接 https://www.acwing.com/problem/content/description/854/ 思路 思路一 我们定义一个数组cnt,cnt[i]表示i这个点被更新的次数,那么如果一个点被更新了大于等于n次,那么就说明有负环,然后直接跑SPFA在更新的时候记录更新次数即可 思路二 之前学的bellman_ford算法我们迭代了n次,其实如果不存在负环的话我们实际上不用迭代n次,迭代n-1次就好了,如果第n次迭代还更新了,那么就说明有负环 代码 #include<bits/st原创 2022-02-10 11:24:30 · 185 阅读 · 0 评论 -
AcWing 851. spfa求最短路(解决负边权最短路)
题目链接 https://www.acwing.com/problem/content/853/ 思路 就是SPFA求最短路的模板,其思路大概是我们要更新所有能被松弛的边,然后更新松弛的边的边,然后就类似BFS的方式逐步更新 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #defi原创 2022-02-10 11:23:34 · 236 阅读 · 0 评论 -
AcWing 853. 有边数限制的最短路(bellman的k边限制最短路)
题目链接 https://www.acwing.com/problem/content/855/ 思路 思路其实利用了bellman_ford算法的特点,之前还没注意过,我们在第一层循环限制每个点可以限制松弛的边的长度,所以对于对边无特殊限制(本题有)的直接循环n次即可,那么我们这里的限制是k,并且注意,在每次松弛前我们要对上一个状态进行记录,然后用上一个状态进行更新,因为如果是使用当前的状态更新的话就会造成一个问题,“串联更新”,这样的话我们的边数限制就没了作用,详情请看代码 代码 #include<原创 2022-02-10 11:23:00 · 226 阅读 · 0 评论 -
AcWing 850. Dijkstra求最短路 II(Dijkstra稠密图堆优化模板)
题面链接 https://www.acwing.com/problem/content/description/852/ 思路 和朴素版的Dijkstra类似,只不过我们对边的存储进行堆优化,优先将短的边先更新(基于贪心策略) 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #def原创 2022-02-10 11:21:08 · 340 阅读 · 0 评论 -
AcWing 849. Dijkstra求最短路 I(稠密图Dijkstra模板)
题面链接 https://www.acwing.com/problem/content/851/ 思路 我们从源点开始找,然后我们将这个点所有指向的点,然后以这个点为中心点看是否能更新其距离,最多更新n次后就能将单元最短路求出 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #de原创 2022-02-10 11:16:55 · 215 阅读 · 0 评论 -
AcWing 848. 有向图的拓扑序列(拓扑排序模板)
题面链接 https://www.acwing.com/problem/content/850/ 思路 对于一个有向图来说,只有无环有向图才有拓扑序列,也可以说一个无环有向图必然有拓扑序列,但是不唯一,我们通过逐步将入度为0的点加进我们的队列里面,然后不断地删边,然后再将下一个度为0的点放进来这样就是我们拓扑排序的一种求解方式了 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分-------------原创 2022-02-08 23:44:17 · 388 阅读 · 0 评论 -
AcWing 847. 图中点的层次(BFS模板)
题目链接 https://www.acwing.com/problem/content/849/ 思路 直接宽搜,然后将当前没有访问过的点放进队列,直到搜完为止 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #define endl "\n" #define PII pair<原创 2022-02-08 23:43:11 · 190 阅读 · 0 评论 -
AcWing 846. 树的重心(DFS)
题目链接 https://www.acwing.com/problem/content/848/ 思路 思路大概是,我们对树上的每个点去算一下它的所有子树的情况,然后再和去除以当前节点为根的子树就是剩下的连通块的大小了,然后我们用一个res值记录这个连通块的大小,然后全局定义一个ans,初始化为比较大的数,然后每次搜到一个点,那么我们就更新一下最大连通块的最小值即可,详情请看代码,建图是使用的链式前向星 代码 #include<bits/stdc++.h> using namespace std原创 2022-02-08 23:42:02 · 296 阅读 · 0 评论 -
AcWing 845. 八数码(BFS)
题目链接 https://www.acwing.com/problem/content/description/847/ 思路 这道题的难点在于怎么存储状态,因为是一个九宫格,我们其实可以把它压缩成一行,然后用字符串存储,那么这样我们就解决了状态问题,然后我们直接通过find函数或者自己手写匹配,每次找到x的位置,然后将x往四个方向移动,看是否是新状态,当然不能出界,如果我们找到了这个状态那么就返回这个状态的最短交换次数即可,如果没找到最后返回1即可,其实我是先写的DFS,然而DFS好像不太聪明的样子,然后原创 2022-01-25 20:36:25 · 366 阅读 · 0 评论 -
AcWing 844. 走迷宫(BFS or DP)
题目链接 https://www.acwing.com/problem/content/description/846/ 思路 直接用BFS跑一个最短路就好了,因为边权都是为1的,并且每次只有四个方向选择 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #define endl "\原创 2022-01-25 20:35:37 · 229 阅读 · 0 评论 -
AcWing 843. n-皇后问题(DFS)
题目链接 https://www.acwing.com/problem/content/description/845/ 思路 我们每一层只需要搜一个,然后判断一下这一层的这个点的列、左斜线、右斜线是否被搜过,如果没有被搜过那么就往下搜,然后归的过程记得回溯,最后搜到第N层的时候就直接输出这种情况即可 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll lo原创 2022-01-25 20:34:54 · 307 阅读 · 0 评论 -
AcWing 842. 排列数字(DFS)
题目链接 https://www.acwing.com/problem/content/description/844/ 思路 回溯搜索即可 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #define endl "\n" #define PII pair<int,int&g原创 2022-01-25 20:34:12 · 187 阅读 · 0 评论