您的位置:首页 > 其它

POJ 3041 Asteroids(最小覆盖数)

2016-02-13 14:01 399 查看
题意:有一个N*N的网格,该网格有K个障碍物.你有一把武器,每次你使用武器可以清楚该网格特定行或列的所有障碍.问你最少需要使用多少次武器能清除网格的所有障碍物?

思路:把网格的行1到N看出左边点集的点,网格的列号看成右边点集的点. 如果(i,j)格有障碍,那么就在左边i点到右边j点之间连接一条边.

现在的问题是 我们要在新图中选择最少的点使得所有边都至少有一个端点被选中了.(想想是不是就等价于原问题使用武器次数最少?)

那么以上就是一个最小覆盖集的问题. 最小覆盖数 = 最大匹配数.

#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=1000;

struct Max_Match
{
int n,m;
vector<int> g[maxn];
bool vis[maxn];
int left[maxn];

void init(int n)
{
this->n=n;
//  this->m=m;
for(int i=1;i<=n;i++) g[i].clear();
memset(left,-1,sizeof(left));
}

bool match(int u)
{
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(!vis[v])
{
vis[v]=true;
if(left[v]==-1 || match(left[v]))
{
left[v]=u;
return true;
}
}
}
return false;
}

int solve()
{
int ans=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(match(i)) ans++;
}
return ans;
}
}MM;
int T;
struct Node
{
double x,y;
}p1[maxn],p2[maxn];
double get_dist(int i,int j)
{
return sqrt( (p1[i].x-p2[j].x)*(p1[i].x-p2[j].x) + (p1[i].y-p2[j].y) * (p1[i].y-p2[j].y));
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
MM.init(n);
while (k--)
{
int u,v;
scanf("%d%d",&u,&v);
MM.g[u].push_back(v);
}
printf("%d\n",MM.solve());
return 0;
}


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.

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.

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).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: