http://poj.org/problem?id=3041
题目大意:
你在一个n*n的迷宫中 迷宫中有障碍物 你有一把武器 每发炮弹可以消灭一行或者一列的障碍物 问要消灭所有的障碍物 最少要几发炮弹
分析:
可以用二分图最小点覆盖来做 行看作集合X 列看作集合Y (x,y)位置有障碍物 x,y之间连一条线就行 然后找最少的点覆盖所有的边 最小点覆盖=最大匹配
跑一边匈牙利
AC代码:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
#define mset(a,x) memset(a,x,sizeof(a))
typedef long long LL;
using namespace std;
int n,m;
int mapx[505][505];
int vis[505];
int ans[505];
int find(int k){
for (int i=1;i<=n;i++){
if (!vis[i]&&mapx[k][i]){
vis[i]=1;
if (!ans[i]||find(ans[i])){
ans[i]=k;
return 1;
}
}
}
return 0;
}
int main (){
while (scanf ("%d%d",&n,&m)!=EOF){
int x,y;
mset(mapx,0);
for (int i=0;i<m;i++){
scanf ("%d%d",&x,&y);
mapx[x][y]=1;
}
mset(ans,0);
int sum=0;
for (int i=1;i<=n;i++){
mset(vis,0);
if (find(i)) sum++;
}
printf ("%d\n",sum);
}
return 0;
}