题目链接:点击打开链接
Asteroids
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 20943 | Accepted: 11376 |
Description
Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the grid.
Fortunately, Bessie has a powerful weapon that can vaporize all the asteroids in any given row or column of the grid with a single shot.This weapon is quite expensive, so she wishes to use it sparingly.Given the location of all the asteroids in the field, find the minimum number of shots Bessie needs to fire to eliminate all of the asteroids.
Fortunately, Bessie has a powerful weapon that can vaporize all the asteroids in any given row or column of the grid with a single shot.This weapon is quite expensive, so she wishes to use it sparingly.Given the location of all the asteroids in the field, find the minimum number of shots Bessie needs to fire to eliminate all of the asteroids.
Input
* Line 1: Two integers N and K, separated by a single space.
* Lines 2..K+1: Each line contains two space-separated integers R and C (1 <= R, C <= N) denoting the row and column coordinates of an asteroid, respectively.
* Lines 2..K+1: Each line contains two space-separated integers R and C (1 <= R, C <= N) denoting the row and column coordinates of an asteroid, respectively.
Output
* Line 1: The integer representing the minimum number of times Bessie must shoot.
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2
Hint
INPUT DETAILS:
The following diagram represents the data, where "X" is an asteroid and "." is empty space:
X.X
.X.
.X.
OUTPUT DETAILS:
Bessie may fire across row 1 to destroy the asteroids at (1,1) and (1,3), and then she may fire down column 2 to destroy the asteroids at (2,2) and (3,2).
The following diagram represents the data, where "X" is an asteroid and "." is empty space:
X.X
.X.
.X.
OUTPUT DETAILS:
Bessie may fire across row 1 to destroy the asteroids at (1,1) and (1,3), and then she may fire down column 2 to destroy the asteroids at (2,2) and (3,2).
大意:一个飞船在飞,N * N 的网格里面有障碍,给出障碍物的位置,一个子弹可以打穿一行或者一列,让找消除所有障碍的最小子弹数目
思路:以行作为 X 集合,以列作为 Y 集合,一个障碍在 ( x,y ),则 x 对应 X 中的点向 y 对应 Y 中的点连一条边,则某个顶点一旦被选,则与之相连的边(也就是障碍)都会被选,也就是选出最少的顶点覆盖所有的边,即最小顶点覆盖。
算法:
Konig定理:一个二分图中的最大匹配数等于这个图中的最小点覆盖数。
最小点覆盖数:假如选中了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点覆盖所有的 边。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,k;
bool map[510][510];
bool vis[510];
int match[510];
int find(int x)
{
for(int i=1;i<=n;i++)
{
if(!vis[i]&&map[x][i])
{
vis[i]=1;
if(match[i]==-1||find(match[i]))
{
match[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
memset(map,0,sizeof(map));
for(int i=1;i<=k;i++)
{
int a,b;
scanf("%d%d",&a,&b);
map[a][b]=1;
}
int ans=0;
memset(match,-1,sizeof(match));
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(find(i))
ans++;
}
printf("%d\n",ans);
}
return 0;
}