莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 最小点覆盖 = 最大匹配数 = 总点数 - 最大独立集 = 总点数 - 最小路径覆盖
2. 对左边的所有非匹配点做一遍增广,并对路径上的点做标记
3. 最小点覆盖 = 左边未被标记的点 + 右边标记的点
4. 此题,把 a[i] -> b[i] 看成一条边,选其中一个点即可
5. 即求最小点覆盖 = 最大匹配数 = 男女分配问题
可参考: 二分图的最大匹配
#include<bits/stdc++.h>
using namespace std;
const int N = 100;
int n,m,k;
bool g[N][N],st[N];
int match[N];
bool find(int x)
{
//枚举所有的女孩
for(int i=1;i<m;i++)
if(!st[i]&&g[x][i])
{
st[i]=true;
int t=match[i];
//这个女孩没对象或者这个女孩的男朋友有备胎
if(!t||find(t))
{
match[i]=x;
return true;
}
}
return false;
}
int main()
{
while(cin>>n,n)
{
cin>>m>>k;
memset(g,0,sizeof g);
memset(match,0,sizeof match);
while(k--)
{
int t,a,b;
cin>>t>>a>>b;
if(!a||!b) continue;
g[a][b]=true;
}
int res=0;
for(int i=1;i<n;i++)
{
memset(st,0,sizeof st);
//能找到老婆就++
if(find(i)) res++;
}
cout<<res<<endl;
}
return 0;
}