POJ 3401 Asteroids 二分图最大匹配 最小点覆盖

原创 2015年11月20日 13:22:05
A - Asteroids


Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

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

题意:

有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人。他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人。

现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧。

比如说,下图中X表示敌人

X . X 
. X . 

. X . 

则,他只需要炸掉第1行与第2列就能炸掉所有的敌人,所以只需要两颗炸弹就可以了。

输入
第一行是一个整数T,表示测试数据的组数(0<T<=400)。
每组测试数据的第一行有两个整数n,K,其中n表示游戏方形区域的大小。(n<=500,K<=10 000)
随后的K行,每行有两个整数i,j表示第i行,第j列有一个敌人(行和列都从1开始编号)。(1<=i,j<=n)
输出
对于每组测试数据,输出一个整数表示最少需要的炸弹颗数


技术分享


2

#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
/*
这道题将每行x看成是结点x,没列y看成是结点y,而障碍物的坐标xy看成是从x到y的
一条边。建图后问题就变成了,找最少的点,使得这些点与所有的边相邻,即最小
点覆盖,用匈牙利算法解决。
-------------------------------
定理:最小点覆盖数 = 最大匹配数,即求图的最大匹配即可,匈牙利算法
-------------------------------
模板讲解:
*/
#define maxn 1001
int n,k,g[maxn][maxn],vis[maxn],link[maxn],r,c;
bool find(int v)
{
  for(int i=1; i<=n; i++)
  {
    if(g[v][i] && !vis[i])///如果结点i和v相邻并且未被查找过
    {
      vis[i] = true;///标记结点i为已查找过
      if(link[i] == 0 || find(link[i]))///表示i不再前一个匹配M中||i在匹配M中,但是从与i相邻的节点出发可以有增广路
      {
        link[i] = v;///记录查找成功记录
        return true;///返回查找成功
      }
    }
  }
  return false;
}
int main()
{
  int ans;
  while(scanf("%d%d",&n,&k) != EOF)
  {
    memset(g,0,sizeof(g));
    memset(link,0,sizeof(link));
    for(int i = 0; i < k; i++)
    {
      scanf("%d%d",&r,&c);
      g[r][c] = 1;
    }
    ans = 0;
    for(int i=1; i<=n; i++)
    {
      memset(vis,0,sizeof(vis));//清空上次搜索时的标记
      if(find(i))//从节点i尝试扩展
        ans++;
    }
    printf("%d\n",ans);
  }
  return 0;
}


POJ训练计划3041_Asteroids(二分图/最小点覆盖=最大匹配)

解题报告 题意: 给出NxN的矩阵,有M个点是障碍 每次只能删除一行或者一列,最少删除多少次才能清除障碍 思路: 把行和列看作两个集合结点,把障碍看作集合结点的连线,这样就转化成求用最少的点...

POJ 3041 Asteroids(二分图最大匹配-最小点覆盖)

poj 3041 题目大意 在N*N的0和1组成的格子,一次操作可以将一行或一列的1全部变成0,问至少要进行多少次操作才能将所有的1全部变成0.分析 这道题是一道比较基础的二分图匹配问题,但也需要...
  • mmy1996
  • mmy1996
  • 2016年08月21日 20:26
  • 172

POJ 3041 Asteroids ( 最小点覆盖数=最大匹配数, 二分图匹配)

匈牙利算法求最小点覆盖数

POJ 3041 最小点覆盖 二分图最大匹配(hungary邻接阵)

二分图由n行(A集)、n列(B集)组成,(x,y)有陨石等价于x∈A -> y∈b 有一条有向边。 消去x行等价于覆盖x这个点。问题转化为求这个二分图的最小点覆盖。 Asteroids ...

POJ 1325 Machine Schedule (最小点覆盖 && 二分图最大匹配)

鏈接: http://poj.org/problem?id=1325 Description As we all know, machine scheduling is a very class...

POJ 2226Muddy Fields(二分图最大匹配之最小点覆盖)

题目地址:http://poj.org/problem?id=2226

poj 3041 二分图最大匹配 最小点覆盖

刷比赛的时候刷到最小点覆盖,来复习一下这个经典。 题意: 给k个在n*n矩阵上的点,可以选一个横坐标或者纵坐标来射穿x或y,在x或y上的怪物都会死掉大概就是这个意思。 问最小射击次数,能...

HDU1150/POJ1325_Machine Schedule(二分图/最小点覆盖=最大匹配)

解题报告 题目传送门 题意: A机器有n个模式,B机器有m个模式,每个作业可以在任何机器的特定模式下工作,转换模式需要耗时,求最小耗时 思路: 把AB两机器的模式当成二分图顶点,模式之间的连线就是某个...

POJ 3692 最小点覆盖 最大二分图匹配

题目在这里:http://poj.org/problem?id=3692 大意是说,在幼儿园中有N女孩M个男孩,其中所有的女孩互相认识,所有的男孩互相认识,并且有一些男孩和女孩互相认识。现在要你找出...
  • hopeztm
  • hopeztm
  • 2012年08月02日 20:12
  • 815

poj 1325 Machine Schedule 二分图最小点覆盖=最大匹配

Description As we all know, machine scheduling is a very classical problem in computer science and ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3401 Asteroids 二分图最大匹配 最小点覆盖
举报原因:
原因补充:

(最多只允许输入30个字)