POJ3041Asteroids(最小点覆盖+然而并不是很理解why)

Asteroids

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 18289   Accepted: 9968

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).

解题思路:

http://www.cnblogs.com/lyy289065406/archive/2011/07/30/2121730.html

把方阵看做一个特殊的二分图(以行列分别作为两个顶点集V1、V2,其中| V1|=| V2|)

然后把每行x或者每列y看成一个点,而障碍物(x,y)可以看做连接x和y的边。按照这种思路构图后。问题就转化成为选择最少的一些点(x或y),使得从这些点与所有的边相邻,其实这就是最小点覆盖问题。

再利用二分图最大匹配的König定理:

最小点覆盖数 = 最大匹配数

 

(PS:最小点覆盖:假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖图的所有的边。)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5
 6 using namespace std;
 7 const int MAX = 500 + 10;
 8 int g[MAX][MAX],link[MAX],vis[MAX];
 9 int n,V1,V2,k;
10 int dfs(int x)
11 {
12     for(int i = 1; i <= V2; i++)
13     {
14         if(vis[i] == 0 && g[x][i])
15         {
16             vis[i] = 1;
17             if(link[i] == 0 || dfs(link[i]))
18             {
19                 link[i] = x;
20                 return true;
21             }
22         }
23     }
24     return false;
25 }
26 int main()
27 {
28     scanf("%d%d", &n,&k);
29     V2 = V1 = n;
30     for(int i = 1; i <= k; i++)
31     {
32         int x,y;
33         scanf("%d%d",&x,&y);
34         g[x][y] = true;
35
36     }
37     int m = 0;
38     memset(link,0,sizeof(link));
39     for(int i = 1; i <= V1; i++)
40     {
41         memset(vis,0,sizeof(vis));
42         if(dfs(i))
43             m++;
44     }
45     printf("%d\n",m);
46     return 0;
47 }

时间: 2024-10-17 07:34:51

POJ3041Asteroids(最小点覆盖+然而并不是很理解why)的相关文章

POJ3041Asteroids【最小点覆盖】

大意: X.X .X. .X.     如左图X代表怪物你可以用激光去消灭它们,一次可以消灭同一行或同一列的所有怪物,问最少多少次才可以把所有怪物消灭完 思路:把x,y坐标分别看成左集合与右集合,若两个坐标有联系就建一条边 最后求得是最小点覆盖 正确性证明:每个怪物的坐标都是由一对x,y确定的,在二分图中每条边就代表一对坐标点,所以只要把所有的边被覆盖就可以了 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <

【最小点覆盖】POJ3041-Asteroids

[题目大意] 在n*n的网格上有n个点,每次删除一行或者一列,问至少要删除几次才能删除完全部的这些店? [思路] 在国庆最后一天到来前,把二分图的三个基本情况[最小点覆盖][DAG图的最小路径覆盖]和[二分图的最大独立集]全部复习了一遍. 这道题是非常典型的最小点覆盖,指的是用最少的点让每条边都至少和两个集合中的某一个点关联. 最小点覆盖=二分图最大匹配数. 对于这道题而言,我们把横坐标作为集合X,纵坐标作为集合Y,对于点(x,y),由X中的x连向Y中的y.对于每条边,只要x和y中有一个被删除即

nyoj237 游戏高手的烦恼(最小点覆盖)

题目237 题目信息 运行结果 本题排行 讨论区 游戏高手的烦恼 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧. 比如说,下图中X表示敌人 X . X . X

最小路径覆盖,最小点覆盖,最大独立点集

原文地址:http://blog.csdn.net/l04205613/article/details/6278394 node  1:最小路径覆盖 在一个PXP的有向图中,路径覆盖就是在图中找一些路经,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联:(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次):如果不考虑图中存在回路,那么每条路径就是一个弱连通子集.由上面可以得出:1.一个单独的顶点是一条路径:2.如果存在一路径p1,p2

HDU 1498 50 years, 50 colors(最小点覆盖,坑题)

50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1635    Accepted Submission(s): 892 Problem Description On Octorber 21st, HDU 50-year-celebration, 50-color balloons floating

最小路径覆盖,最小点覆盖,最大独立点集(转)

来自:http://blog.csdn.net/l04205613/article/details/6278394 node  1:最小路径覆盖 在一个PXP的有向图中,路径覆盖就是在图中找一些路经,使之覆盖了图中的 所有顶点,且任何一个顶点有且只有一条路径与之关联:(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一 次):如果不考虑图中存在回路,那么每条路径就是一个弱连通子集. 由上面可以得出: 1.一个单独的顶点是一条路径: 2.如果存在一路径p1

二分图最大匹配,最小路径覆盖,最小点覆盖,最大独立集,最小边覆盖与建图方法

转载请注明出处(别管写的好坏,码字也不容易):http://blog.csdn.net/hitwhacmer1 前言:         有自己写的,有摘的别人的,前面是摘的,也是无心整理,出错是难免的,反正我都不会证明,智人见智,别被我误导了. §1图论点.边集和二分图的相关概念和性质 点覆盖.最小点覆盖 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是"点" 覆盖了所有"边"..极小点覆盖(minimal vertex covering):本身为点覆

hdu1498最小点覆盖

1.题意:(很是重要,理解了题意才能有转换为最小点覆盖的思路),对于一个n*n的矩阵,里面有一些颜色不同的气球(用1~50标记种类),给你K次机会,每次机会可以把某一行或者某一列中的某一种颜色全部消灭,问你K次消灭之后,有哪些颜色是你不能消灭完的....拿题目的案例 2 来画图: 我们这里只有K=1次机会去消除,,我们只有四种方式,从图中来看,1次机会我们不可能把1号颜色全部消除,但是有能把2号颜色消除的情况 2.分析:那么对于题目,我们的解决方案就是要把图中所有的颜色枚举一次,比如枚举 i 号

HDU1498_50 years, 50 colors(二分图/最小点覆盖=最大匹配)

解题报告 题意: 给你一个矩阵,矩阵里面是气球,气球有1-50种颜色,问你在k次之内能不能把那种存在的颜色消掉(每种颜色k次机会),不能消掉的颜色按升序输出. 思路: 白想一上午了,理解错了题意,原来每种有k次可以消除的机会,还以为是总共k次机会消气球. 理解对了就很好做,类似POJ3041 求最小点覆盖.用最少的点覆盖最多的边. 每次枚举颜色看是否操作次数超过k次. 英语.................... ...................... #include <iostream