点击打开链接

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. fork()函数

    现代操作系统提供的三种构造并发程序的方法: •进程 一个进程实体包括:代码段,数据段, 进程控制块 fork()函数:通过系统调用创建一个与原来一模一样的子线程,[用来处理请求信号,而父进程继续一直处 ...

  2. Winform後台如何動態修改App.config文件里的內容

    以下方法修改的,自己添加的app.config裡面不會顯示出修改的東西. 方法一:通過使用System.Xml.XmlDocument對象的方法進行bin\debug\~.vshost.exe.Con ...

  3. (转)oracle字符集与汉字

    Oracle与汉字问题与字符集 分类: oracle 2012-10-29 17:31 425人阅读 评论(0) 收藏 举报 Oracle字符集引起的几个问题,常见的就是汉字占多少个字节,其次就是字符 ...

  4. 【转】从零开始编写自己的C#框架(7)——需求分析

    转自:http://www.cnblogs.com/EmptyFS/p/3653934.html 本章内容虽然叫“需求分析”,实际上关于具体的需求分析操作步骤并没有深入去写,因为细化的话那将是一本厚厚 ...

  5. T-SQL 批处理

    批处理简介 批处理是作为一个逻辑单元的T-SQL语句.如果一条语句不能通过语法分析,那么不会运行任何语句.如果一条语句在运行时失败,那么产生错误的语句之前的语句都已经运行了. 为了将一个脚本分为多个批 ...

  6. Test log4net

    protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGloba ...

  7. UVALive 5888 Stack Machine Executor (栈+模拟)

    Stack Machine Executor 题目链接: http://acm.hust.edu.cn/vjudge/problem/26636 Description http://7xjob4.c ...

  8. Codeforces 710 E. Generate a String (dp)

    题目链接:http://codeforces.com/problemset/problem/710/E 加或者减一个字符代价为x,字符数量翻倍代价为y,初始空字符,问你到n个字符的最小代价是多少. d ...

  9. NSInvocation Basics

    In this article I'm going to cover the basics and usages of NSInvocation. What is NSInvocation? Appl ...

  10. C++中使用接口

    面向对象的语言诸如JAVA提供了Interface来实现接口,但C++却没有这样一个东西,尽管C++ 通过纯虚基类实现接口,譬如COM的C++实现就是通过纯虚基类实现的(当然MFC的COM实现用了嵌套 ...