Stop learning useless algorithms.
Go and solve some problems.
Learn how to use binary search.
Analysis
常用技巧,把一行或一列转换为点,然后原先的点转换成这个二分图的边。
然后考虑选出第 $k$ 大的数的最小值,这个比较难以处理。那我们考虑二分这个最小值,并判断是否合理。
怎么判断呢?
我一开始是将 $val \geq mid$ 的边加入来跑二分图的最大匹配。但这个方法有一个严重的问题。就是这个边权最小值 $(mid)$ –最大匹配数 $(cnt)$ 的函数关系并非单增。有可能有多个边权最小值都是这种最大匹配数(函数是离散的),而如果采用这种二分方式则会找到 $cnt$ 与 $cnt+1$ 分界线上的那个 $mid$ ,这并不是我们想要的。我们想要 $cnt-1$ 与 $cnt$ 分界线上的那个才是答案。
因此我们需要转换一下思路,将 $val \leq mid$ 的边加入,将 $cnt$ 与 $n-k+1$ 进行比较。
Code
1 | const int N = 260; |
1 | IL ll binary() { |
1 | IL int check(ll st) { |
1 | IL bool dfs(int x, ll st) { |