题目描述
分析
对于每一个小行星,可以将它的行与列连边,然后可以发现,这就是要求这个二分图的最小顶点覆盖。又有定理二分图的最小顶点覆盖=该图的最大匹配数,于是就这样做。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int g[505][505];
int n,k,ans;
int f[505],vis[505];
bool dfs(int x) {
for (int i=1;i<=n;i++) {
if (g[x][i]&&!vis[i]) {
vis[i]=1;
if (!f[i]||dfs(f[i])) {
f[i]=x;
return true;
}
}
}
return false;
}
int main() {
scanf("%d%d",&n,&k);
for (int i=1;i<=k;i++) {
int a,b;
scanf("%d%d",&a,&b);
g[a][b]=1;
}
for (int i=1;i<=n;i++) {
memset(vis,0,sizeof(vis));
if (dfs(i)) ans++;
}
printf("%d",ans);
return 0;
}