标签:i++ 模板题 意义 tin class hung mem type pre
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;
}
标签:i++ 模板题 意义 tin class hung mem type pre
原文地址:http://www.cnblogs.com/HIKARI1149/p/6923027.html