最大匹配数就等于最大点覆盖,因为在图里面,凡是要覆盖的点必定是连通的,而最大匹配之后,若还有点没有覆盖到,则必定有新的匹配,与最大匹配数矛盾,如果去掉一些匹配,则必定有点没有覆盖到。
POJ 1469
比较简单,用的经典的二分图匹配算法。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
|
POJ 3041
最小覆盖问题,转化为求最大匹配
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int mat[510][510],cnt[510];
int vis[510],lefts[510];
int n,k;
bool match(int u)
{
for (int i=0;i<cnt[u];i++){
int v=mat[u][i];
if (!vis[v]){
vis[v]=1;
if (lefts[v]==-1 || match(lefts[v])){
lefts[v]=u;
return true;
}
}
}
return false;
}
int main()
{while (scanf("%d%d",&n,&k)!=EOF)
{
memset(mat,0,sizeof mat);
memset(cnt,0,sizeof cnt);
int a,b;
for (int i=0;i<k;i++){
scanf("%d%d",&a,&b);
mat[a][cnt[a]++]=b;
}
memset(lefts,-1,sizeof lefts);
int ans=0;
for (int i=1;i<=n;i++){
memset(vis,0,sizeof vis);
if (match(i)) ans++;
}
printf("%d\n",ans);
}
return 0;
}
二分图匹配 最大匹配数+最大点覆盖 POJ 1469+POJ 3041,布布扣,bubuko.com