点击打开链接

Konig定理:二分图的最小顶点覆盖数 = 二分图的最大匹配数

题意: 在N*N的网络中有K颗小行星。小行星i的位置是(Ri, Ci)。如今有一个强力的武器可以用一发光束将一整行或一整列的小行星消灭。想要利用这个武器消灭全部的小行星最少须要几发光束?

分析: 以小行星的左右坐标建立二分图,就能够看出是求二分图的最小顶点覆盖数。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std; const int maxn = 500 + 5; //单側顶点的最大数目 struct BPM{
int n, m; //左右顶点个数
vector<int> G[maxn]; //邻接表
int left[maxn];//left[i]为右边第i个点的匹配点编号,-1表示不存在
bool T[maxn];//T[i]为右边第i个点是否已标记 int right[maxn]; //求最小覆盖用
bool S[maxn]; //求最小覆盖用 void init(int n, int m){
this->n = n;
this->m = m;
for(int i=0; i<n; ++i) G[i].clear();
} void AddEdge(int u, int v){
G[u].push_back(v);
} bool match(int u){
S[u] = true;
for(int i=0; i<G[u].size(); ++i){
int v = G[u][i];
if(!T[v]){
T[v] = true;
if(left[v]==-1 || match(left[v])){
left[v] = u;
right[u] = v;
return true;
}
}
}
return false;
} //求最大匹配
int solve()
{
memset(left, -1, sizeof left );
memset(right, -1, sizeof right );
int ans = 0;
for(int u=0; u<n; ++u){
//从左边结点u開始增广
memset(S, 0, sizeof S );
memset(T, 0, sizeof T );
if(match(u)) ans++;
}
return ans;
}
//求最小覆盖。 X 和 Y为最小覆盖中的点集
int mincover(vector<int>& X, vector<int>& Y){
int ans = solve();
memset(S, 0, sizeof S );
for(int u =0; u<n; ++u)
if(right[u]==-1) match(u);
//从全部X未盖点出发增广
for(int u=0; u<n; ++u)
if(!S[u]) X.push_back(u); //X中的未标记点
for(int v=0; v<m; ++v)
if(T[v]) Y.push_back(v); //Y中的已标记点
return ans;
}
}; BPM solver;
int main()
{
int i, j, n, k;
scanf("%d%d", &n, &k);
solver.init(n, n);
for(i=0; i<k; ++i)
{
int x, y;
scanf("%d%d", &x, &y);
x--; y--;
solver.AddEdge(x, y); //有向图
}
int ans = solver.solve();
printf("%d\n", ans);
return 0;
}

poj3041-Asteroids , 二分图的最小顶点覆盖数 = 最大匹配数的更多相关文章

  1. [poj3041]Asteroids(二分图的最小顶点覆盖)

    题目大意:$N*N$的网格中有$n$颗行星,若每次可以消去一整行或一整列,求最小的攻击次数使得消去所有行星. 解题关键:将光束当做顶点,行星当做连接光束的边建图,题目转化为求该图的最小顶点覆盖,图的最 ...

  2. HDU1054Strategic Game(最小顶点覆盖数)

    我们来先了解一下什么是最小顶点覆盖: 图G的顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点.我们称集合V覆盖了G的边.最小顶点覆盖是用最少的顶点来覆盖所有的边.顶点覆盖数是最小顶 ...

  3. poj3041 Asteroids 匈牙利算法 最小点集覆盖问题=二分图最大匹配

    /** 题目:poj3041 Asteroids 链接:http://poj.org/problem?id=3041 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一把枪,每一发子弹可 ...

  4. POJ3041 Asteroids(二分图最小点覆盖)

    Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape o ...

  5. POJ3041 Asteroids(二分图最大匹配)

    题目链接. 分析: 暂略. AC代码: #include <iostream> #include <cstdio> #include <cstring> #incl ...

  6. POJ3041 Asteroids 二分图匹配 匈牙利算法

    原文链接http://www.cnblogs.com/zhouzhendong/p/8229200.html 题目传送门 - POJ3041 题意概括 有一个n*n的矩阵,有些点是障碍物. 现在每次可 ...

  7. HDU 2444 The Accomodation of Students (二分图存在的判定以及最大匹配数)

    There are a group of students. Some of them may know each other, while others don't. For example, A ...

  8. poj3041 Asteroids(二分图最小顶点覆盖、二分图匹配)

    Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape o ...

  9. POJ-1325 Machine Schedule 二分图匹配 最小点覆盖问题

    POJ-1325 题意: 有两台机器A,B,分别有n,m种模式,初始都在0模式,现在有k项任务,每项任务要求A或者B调到对应的模式才能完成.问最少要给机器A,B调多少次模式可以完成任务. 思路: 相当 ...

随机推荐

  1. For循环List中删除正确的方式

    单线程public class Test { public static void main(String[] args) { ArrayList<Integer> list = new ...

  2. Request、Request.Form、Request.QueryString 用法的区别

    Request.Form:获取以POST方式提交的数据. Request.QueryString:获取地址栏参数(以GET方式提交的数据). Request:包含以上两种方式(优先获取GET方式提交的 ...

  3. bzoj 1806 [Ioi2007]Miners 矿工配餐(DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1806 [题意] 给定一个权在1..3内的序列,在保持相对位置不变的情况下拆分成两个序列 ...

  4. .hpp文件

    hpp在C++中的含义 以前在开源代码里面遇到过,今天看boost源码的时候又遇到了,故学习一下. hPP,计算机术语,用C/C++语言编写的头文件,通常用来定义数据类型,声明变量.函数.结构和类.而 ...

  5. jetty8的多实例部署(LT项目开发参考)

    LT项目使用的EIP是运行在JETTY上,此文供开发和实施参考 1.windows下 win下部署多个jetty8很简单,首先将jetty8复制多个文件夹,其次按分配的端口号修改[JETTY_HOME ...

  6. 40个最好的Tumblr主题

    如果安装了一款较好的Tumblr主题,你的Tumblr空间将焕然一新.然而找到一款合适的主题并不是一件容易的事,这正是本文中我整理那么多优质的Tumblr模板作为灵感的原因.其中有一些免费的Tumbl ...

  7. cocos2d-js屏幕任何位置点击开始的实现

    ctor:function () { this._super(); if ('mouse' in cc.sys.capabilities) cc.eventManager.addListener({ ...

  8. Spring中的BeanUtils与apache commons中的BeanUtils用法[1]

    1. 前言 在开发过程中,经常遇到把要给一个bean的属性赋给另外一个bean.最笨的方法是每个属性都单独写一个,聪明的方法是应用反射写一个工具方法.考虑到这个需求基本每个程序员都会遇到,那么一定已经 ...

  9. sql的join用法

    SQL join 用于把来自两个或多个表的行结合起来,sql join主要包括inner join. left join .right join .full outer join. 先介绍一下表里面的 ...

  10. makefile中一些符号的含义

    关于gnu make的详细介绍参看http://www.gnu.org/software/make/manual/make.html   规则 让我们先来粗略地看一看Makefile的规则. targ ...