poj3041-Asteroids , 二分图的最小顶点覆盖数 = 最大匹配数
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 , 二分图的最小顶点覆盖数 = 最大匹配数的更多相关文章
- [poj3041]Asteroids(二分图的最小顶点覆盖)
题目大意:$N*N$的网格中有$n$颗行星,若每次可以消去一整行或一整列,求最小的攻击次数使得消去所有行星. 解题关键:将光束当做顶点,行星当做连接光束的边建图,题目转化为求该图的最小顶点覆盖,图的最 ...
- HDU1054Strategic Game(最小顶点覆盖数)
我们来先了解一下什么是最小顶点覆盖: 图G的顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点.我们称集合V覆盖了G的边.最小顶点覆盖是用最少的顶点来覆盖所有的边.顶点覆盖数是最小顶 ...
- poj3041 Asteroids 匈牙利算法 最小点集覆盖问题=二分图最大匹配
/** 题目:poj3041 Asteroids 链接:http://poj.org/problem?id=3041 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一把枪,每一发子弹可 ...
- POJ3041 Asteroids(二分图最小点覆盖)
Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape o ...
- POJ3041 Asteroids(二分图最大匹配)
题目链接. 分析: 暂略. AC代码: #include <iostream> #include <cstdio> #include <cstring> #incl ...
- POJ3041 Asteroids 二分图匹配 匈牙利算法
原文链接http://www.cnblogs.com/zhouzhendong/p/8229200.html 题目传送门 - POJ3041 题意概括 有一个n*n的矩阵,有些点是障碍物. 现在每次可 ...
- 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 ...
- poj3041 Asteroids(二分图最小顶点覆盖、二分图匹配)
Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape o ...
- POJ-1325 Machine Schedule 二分图匹配 最小点覆盖问题
POJ-1325 题意: 有两台机器A,B,分别有n,m种模式,初始都在0模式,现在有k项任务,每项任务要求A或者B调到对应的模式才能完成.问最少要给机器A,B调多少次模式可以完成任务. 思路: 相当 ...
随机推荐
- android读取data下得数据
拥有Root权限的情况 adb shell su cd /data/data/com.package 然后就可以直接读取 没有Root的情况 adb shell run-as com.package ...
- 基于mapreduce的大规模连通图寻找算法
基于mapreduce的大规模连通图寻找算法 当我们想要知道哪些账号是一个人的时候往往可以通过业务得到两个账号之间有联系,但是这种联系如何传播呢? 问题 已知每个账号之间的联系 如: A B B C ...
- about云资源共享
Nosql资源: http://www.aboutyun.com/thread-5655-1-1.html (1)redis安置(2)RedisAdminUI.zip(3)redis安装部署(4) ...
- [POJ] #1004# Financial Management : 浮点数运算
一. 题目 Financial Management Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 173910 Acc ...
- Sql group by 分组取时间最新的一条数据
with MiPriceTopOne as (select classid,max(dataTime) dataTime,max(id) as id from MiPrice group by cla ...
- 企业网管软件实战之SolarWinds LANsurveyor
SolarWinds LANsurveyor是一款比较容易掌握的网络管理软件,他能自动探索你的LAN或WAN,并生成全面的,易于浏览的集成了OSI 2层和 3层 拓扑数据的网络图表.其主要功能有: 1 ...
- Java ClassLoader 原理详细分析
一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程 ...
- 第三百零八至三百二十天 how can I 坚持
十三天..2月4号至2月16号,好快,假期还没开始就结束了.一一回忆下. 2月4号,腊月二十六,最后一天上班,没多大事,好像是玩了一天,东月回家,貌似路上好折腾,晚上D401,和她聊了一路,也聊了好多 ...
- c#动态加载dll文件
1.在写一个记录日志到文件中的类库(生成dll文件copy到一个目录中去,然后在主函数的appconfig中去配置. using System; using System.Collections.Ge ...
- 图片转换成base64_encode的链接代码示例
<?php $file = "example.jpg"; $type = getimagesize( $file ); //取得图片的大小,类型等 $file_content ...