这道题目从感觉上来看,应该是匈牙利的模板的过程中,如果遇到某个点找不到增广路,直接结束循环,即
for(int i=1;i<=m;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++;
else break;
}
事实上,这确实是答案,那么为什么是对的?
我暂时不能直接从图论的角度给出严谨证明,但我们来考虑二分
显然这道题目是具有单调性的,如果我们二分一个值\(mid\),然后只对前\(mid\)个问题跑匈牙利,那么显然跑完之后判断是否是完备匹配就可以了
那么我们考虑最终的答案,即把所有的二分图匹配写出来,然后考虑前面连续的若干个问题最多的二分图匹配,那么显然这就是答案,假设为\(ans\)
那么在\(mid≤ans\)的时候,最终跑出来一定是完备匹配;在\(mid>ans\)的时候,最终跑出来一定不是完备匹配
而我们每次二分,对同一个代码来说,跑的过程不是一模一样的吗?
所以我们根本就不用二分,直接跑匈牙利,第一次没找到增广路的时候,这一定是答案
标签:二分,匹配,匈牙利,超级,mid,英雄,答案,ans From: https://www.cnblogs.com/dingxingdi/p/18014202