标签:
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 17861 | Accepted: 9729 |
Description
Input
Output
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2
Hint
题意:
太空中有个N * N的网格,网格中分布了K个危险的小行星,有一种武器,只需要一枚子弹,就可以使某一行或者某一列上的所有小行星毁灭。问最少需要多少子弹,才能摧毁所有的小行星。
思路:
裸的最小点覆盖数题目。水水水。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 550
using namespace std;
int map[maxn][maxn];
int used[maxn];
int link[maxn];
int n, m;
void init(){
memset(map, 0, sizeof(map));
}
void getmap(){
while(m--){
int a, b;
scanf("%d%d", &a, &b);
map[a][b] = 1;
}
}
bool dfs(int x){
for(int i = 1; i <= n; ++i){
if(map[x][i] && !used[i]){
used[i] = 1;
if(link[i] == -1 || dfs(link[i])){
link[i] = x;
return true;
}
}
}
return false;
}
int hungary(){
int ans = 0;
memset(link, -1, sizeof(link));
for(int i = 1; i <= n; ++i){
memset(used, 0, sizeof(used));
if(dfs(i))
ans++;
}
return ans;
}
int main (){
while(scanf("%d%d", &n, &m) != EOF){
init();
getmap();
int sum = hungary();
printf("%d\n", sum);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 3041--Asteroids【二分图 && 最小点数覆盖】
标签:
原文地址:http://blog.csdn.net/hpuhjh/article/details/47983865