HDU 2063 过山车 二分图最大匹配(模板题)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2063 过山车 二分图最大匹配(模板题)相关的知识,希望对你有一定的参考价值。
http://acm.hdu.edu.cn/showproblem.php?pid=2063
https://www.renfei.org/blog/bipartite-matching.html
交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。
增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路(agumenting path)
增广路有一个重要特点:非匹配边比匹配边多一条。因此,研究增广路的意义是改进匹配。只要把增广路中的匹配边和非匹配边的身份交换即可。由于中间的匹配节点不存在其他相连的匹配边,所以这样做不会破坏匹配的性质。交换后,图中的匹配边数目比原来多了 1 条。
#include <bits/stdc++.h> using namespace std; const int N=2e3+20; typedef long long ll; int g[N][N];// 两边定点的连线 int k,n,m,vis[N]; int linker[N]; int dfs(int u) { for(int i=1;i<=m;i++) { if(g[u][i]&&!vis[i]) { vis[i]=1; if(linker[i]==-1||dfs(linker[i]))//如果u-i未匹配||i匹配 走匹配边 { linker[i]=u;//非匹配边和匹配边交换 return true; } } } return false;//无增广路 } int hungary() { int res=0; int u; memset(linker,-1,sizeof(linker)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i))//从未盖点出发找增广路 res++; } return res; } int main() { while(cin>>k&&k) { memset(g,0,sizeof(g)); cin>>n>>m; int u,v; for(int i=1;i<=k;i++) { cin>>u>>v; g[u][v]=1; } printf("%d\n",hungary());//最大匹配 } return 0; }
以上是关于HDU 2063 过山车 二分图最大匹配(模板题)的主要内容,如果未能解决你的问题,请参考以下文章