题意
求一个图的最大匹配。
思路
用匈牙利算法找出增广链,如果找得到的话我们就可以统计一次匹配。
代码
#include<cstdio>
#include<cstring>
using namespace std;
int n,e,x,y,head[10001],tot,ans,vis[10001],link[10001];
struct node{
int to,next;
}f[10001];
void add(int u,int v)
{
f[++tot].next=head[u];
f[tot].to=v;
head[u]=tot;
}
int find(int x)//找增广链
{
int q;
for (int i=head[x];i;i=f[i].next)
{
int j=f[i].to;
if (!vis[j])
{
q=link[j];link[j]=x;vis[j]=1;
if (!q||find(q)) return 1;//如果这个点可以匹配其它的点或者没有被匹配过
//我们就可以让当前的点和它匹配
link[j]=q;//不行的话就还原回来
}
}
return 0;
}
int main()
{
scanf("%d%d",&n,&e);
for (int i=1;i<=e;i++)
{
scanf("%d%d",&x,&y);
add(x,y);//建表
}
for (int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if (find(i)) ans++;
}
if (ans) printf("%d",ans);
else printf("NO SOLUTION");
}
本文介绍如何使用匈牙利算法寻找图中的最大匹配。通过构造增广链并不断更新匹配状态,最终找到图中最大的匹配数。文章提供了一个完整的C++实现代码示例。
918

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



