POJ 3041 Asteroids(二分图匹配)

原创 2018年04月17日 11:26:32
Asteroids
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 25136 Accepted: 13579

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

题解:
每个小行星看做一条边,行星坐标为(x,y)则从x到y建一条边。问题转化为求
最少的点覆盖所有边,即最小点覆盖,在二分图中最小点覆盖等于最大匹配。
代码:

#include<cstdio>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=505;
int match[maxn];
bool vis[maxn];
vector<int>p[maxn];
bool dfs(int v)
{
    vis[v]=1;
    for(int i=0;i<p[v].size();i++)
    {
        int u=p[v][i],w=match[u];
        if(w<0||(!vis[w]&&dfs(w)))
        {
            //match[v]=u;
            match[u]=v;
            return 1;
        }
    }
    return 0;
}
int main()
{
    int n,k;scanf("%d%d",&n,&k);
    for(int i=0;i<k;i++)
    {
        int x,y;scanf("%d%d",&x,&y);
        p[x].push_back(y);
        //p[y].push_back(x);
    }
    int ans=0;
    memset(match,-1,sizeof(match));
    for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i))ans++;
    }
    printf("%d\n",ans);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/albertluf/article/details/79972287

数据结构基础系列(4):串

数据结构课程是计算机类专业的专业基础课程,在IT人才培养中,起着重要的作用。课程按照大学计算机类专业课程大纲的要求,安排教学内容,满足需要系统学习数据结构的人。系列课程包含11个部分,本课为第4部分串,介绍串的概念、用途,串的顺序和链式存储结构,以及在这两种结构下基本运算的实现,并介绍了模式匹配的经典算法。
  • 2015年09月16日 20:16

POJ 3041 Asteroids(最小覆盖数)

POJ 3041 Asteroids(最小覆盖数) http://poj.org/problem?id=3041 题意:        有一个N*N的网格,该网格有K个障碍物.你有一把武器,每次你使用...
  • u013480600
  • u013480600
  • 2014-08-16 18:04:53
  • 877

POJ 3041--Asteroids【二分图 && 最小点数覆盖】

Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17861   Acc...
  • hpuhjh
  • hpuhjh
  • 2015-08-25 21:27:33
  • 373

POJ3041 二分图最大匹配(网络流算法)

这题可以先构造一个二分图,它的|X|=|Y|=N,每当输入一个数对(x,y)时,连接一条x->y的边,求最小点覆盖即可。 最小点覆盖:对于一个二分图中的每一条边(u,v)都选其中一个顶点(多条边可以...
  • yc5_yc
  • yc5_yc
  • 2012-05-02 21:16:38
  • 1779

POJ - 3041 Asteroids 【二分图匹配】

Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20881     ...
  • lututu123
  • lututu123
  • 2016-10-26 18:55:17
  • 142

POJ - 3041 Asteroids (二分图匹配)

题意:给你一个图里面有坐标,你每次可以摧毁一行的所有点,或者摧毁一列的所有点,我们最少需要多少次,让他消灭所有点。思路:这是我写的第一道非模板题的二分图,感叹建图是真的叼~我们把行和列抽出来,之后去连...
  • wjmwsgj
  • wjmwsgj
  • 2018-04-11 16:03:42
  • 2

[POJ 3041]Asteroids[二分图匹配]

题目链接:[POJ 3041]Asteroids[二分图匹配] 题意分析: Bessie要把阻挡她的小行星都炸掉,一次可以炸一排,不过由于这种炮弹很值钱,所以她需要你计算最少需要用多少炮弹可以打掉所有...
  • CatGlory
  • CatGlory
  • 2015-08-17 23:20:13
  • 331

POJ 3041 - Asteroids(二分图匹配)

题目: http://poj.org/problem?id=3041 题意: n*n的矩阵,给出有敌人的位置,每根剑可以伤害一行或一列,求出将敌人全部伤害的用的最少的剑数。 思路; 行为...
  • u013534690
  • u013534690
  • 2015-04-15 20:56:22
  • 328

POJ 3041 Asteroids——二分图匹配

把激光看做点,星星看做边建图#include &amp;lt;cstdio&amp;gt; #include &amp;lt;cstring&amp;gt; #include &amp;lt;iost...
  • hao_zong_yin
  • hao_zong_yin
  • 2018-02-17 20:31:23
  • 38

poj 3041 Asteroids 二分图匹配

#include #define MAX_N 500+16 int map[MAX_N][MAX_N]; int visit[10000]; int match[10000]; int k,n; in...
  • sky_zdk
  • sky_zdk
  • 2017-03-12 11:52:07
  • 101
收藏助手
不良信息举报
您举报文章:POJ 3041 Asteroids(二分图匹配)
举报原因:
原因补充:

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