shift+command+/ 表示/。。。/
P3386 【模板】二分图最大匹配
题目大意
给定一个二分图,左部点集大小 n,右部点集大小 m,边集大小 e。求该二分图的最大匹配数(即最多的边数,使得这些边没有任何公共端点)。
AC代码
增广路的神奇之处在于,如果我们沿着一条增广路,将路径上的非匹配边变成匹配边,同时将匹配边变成非匹配边,那么匹配边的总数就会增加 1。
举个例子:
假设我们有下面这条增广路(实线代表匹配边,虚线代表非匹配边):
增广路的定义是一条从未匹配点出发,依次交替经过“非匹配边”和“匹配边”,最终到达另一个未匹配点的路径。
未匹配点1 --(虚线)--> 点A ==(实线)== 点B --(虚线)--> 未匹配点2
-
这条路径从一个未匹配点开始,到一个未匹配点结束。
-
路径上的边是“非匹配-匹配-非匹配”交替的。
如果我们对它进行“增广”操作(虚实互换):
未匹配点1 ==(实线)== 点A --(虚线)-- 点B ==(实线)== 未匹配点2
看!原来的 1 条匹配边(A-B)现在变成了 2 条(点1-A,B-点2)。匹配的总数增加了!
一个重要的结论是:一个匹配是最大匹配,当且仅当图中不存在增广路。 这也构成了匈牙利算法的理论基础。
最新算法模板看这个:
2026 杭电春季联赛 2——1002-庭扫落樱(二分图最大匹配)(最小边覆盖和最大匹配之间的关系)
视频教程
https://www.acwing.com/video/290/
匈牙利算法精髓:
👉 Note: 姑娘 j (connectedr)遇到新的追求者的心理活动:如果原来的男朋友有备胎,我就绿他,如果没有,那我看他太可怜了,就一直跟他在一起吧。
还有一个要注意的地方就是vis数组每次都要清空,因为实际上记的是这次寻找有没有找过这个宠物,这是为了防止死循环的发生(爆栈)
AC https://www.luogu.com.cn/record/183163854
1 | // https://www.luogu.com.cn/problem/P3386 |
心路历程(WA,TLE,MLE……)
好像有点问题,但问题不大,过了70pts
https://www.luogu.com.cn/record/183070840
1 | // https://www.luogu.com.cn/problem/P3386 |
80pts https://www.luogu.com.cn/record/183076675
1 | // https://www.luogu.com.cn/problem/P3386 |
用循环是解决不了的,还是要递归。
860. 染色法判定二分图
题目大意
给定一个无向图,判断该图是否为二分图(即是否能将所有点分成两个集合,使得所有边都只连接不同集合的点)。
AC代码
1 | #include <iostream> |
P4779 【模板】单源最短路径(标准版)
题目大意
给定一个有向带权图(N 点 M 边),求从源点 s 到所有其他点的最短路径长度。数据范围较大(Nle105,Mle2times105),需要 O(MlogN) 级别的算法(如堆优化 Dijkstra)。
AC代码
注意,priority_queue的比较操作符与sort,set是反的
参考题解:https://www.luogu.com.cn/problem/solution/P4779
其实总结来讲就是使用堆然后找到dis值最小的点,将其确认为确定点(已经固定了,dis值不太可能再更新了)
https://www.luogu.com.cn/record/181960419
1 | #include <iostream> |
心路历程(WA,TLE,MLE……)
未经堆优化的算法(其实不是Dijkstra)TLE
https://www.luogu.com.cn/record/181877100
1 | #include <iostream> |
P3371 【模板】单源最短路径(弱化版)
题目大意
给定一个有向带权图(N 点 M 边),求从源点 s 到所有其他点的最短路径长度。如果无法到达则输出特定值(如 231−1)。数据范围较小,允许 O(NM) 算法。
AC代码
https://www.luogu.com.cn/problem/P3371
1 | #include <iostream> |
第一次提交就基本AC了,没啥心路历程