题意:
有m个女生和n个男生,k个可以建立关系。一个女生只能和一个男生建立关系,求最大的关系数。
思路:
二分图最大匹配,匈牙利算法枚举男生来找增广路,如果能找到,匹配数加一。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
vector<int> g[maxn];
int link[maxn],vis[maxn];
int k,n,m;
bool dfs(int u)
{
for(int i=0;i<g[u].size();i++)
{
int v = g[u][i];
if(!vis[v])
{
vis[v] = 1;
if(link[v]==-1||dfs(link[v]))
{
link[v] = u;
return true;
}
}
}
return false;
}
int main()
{
while(~scanf("%d",&k)&&k)
{
scanf("%d%d",&m,&n);
for(int i = 1;i<=n;i++)
{
g[i].clear();
}
memset(link,-1,sizeof(link));
for(int i = 0;i<k;i++)
{
int u,v;
scanf("%d%d",&u,&v);
g[v].push_back(u);
}
int ans = 0;
for(int i = 1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d\n",ans);
}
return 0;
}
本文介绍了一种使用匈牙利算法解决二分图最大匹配问题的方法。具体问题为:给定一定数量的男生和女生,以及他们之间可能建立的关系,目标是找出能够建立的最大关系数。通过枚举男生节点来寻找增广路径实现匹配。
1965

被折叠的 条评论
为什么被折叠?



