POJ-3040-Asteroids
http://poj.org/problem?id=3041
X表示一个敌人,给出所有敌人的坐标,炸弹可以炸掉该炸弹所在一行或者所在的一列,求最少需要多少个炸弹才能炸掉所有的敌人
对于每一个敌人,炸弹要么在该敌人所在的行,要么在该敌人所在的列,将敌人的所在行当作X集合,敌人所在列当作Y集合,每个敌人的X和Y连一条边,那么题目就转为求最小点覆盖,最小点覆盖等于最大匹配
#include<cstdio> #include<cstring> #include<cstdlib> using namespace std; int map[505][505]; int visit[505]; int result[505]; int n,m; int find(int a) { int i; for(i=1;i<=n;i++) { if(map[a][i]&&!visit[i]) { visit[i]=1; if(!result[i]||find(result[i])) { result[i]=a; return 1; } } } return 0; } int main() { int x,y,ans,i; scanf("%d%d",&n,&m); memset(map,0,sizeof(map)); while(m--) { scanf("%d%d",&x,&y); map[x][y]=1; } ans=0; memset(result,0,sizeof(result)); for(i=1;i<=n;i++) { memset(visit,0,sizeof(visit)); if(find(i)) ans++; } printf("%d\n",ans); return 0; }