我们来先了解一下什么是最小顶点覆盖;

G顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点。我们称集合V覆盖了G的边。最小顶点覆盖是用最少的顶点来覆盖所有的边。顶点覆盖数是最小顶点覆盖的大小。

相应地,图G边覆盖是一个边集合E,使得G中的每一个顶点都接触E中的至少一条边。

如果只说覆盖,则通常是指顶点覆盖,而不是边覆盖。

在二分图中  :最大匹配数=最小顶点覆盖数;

求二分图最大匹配可以用最大流(Maximal Flow)或者匈牙利算法(Hungarian Algorithm)

所以下面介绍主要一下匈牙利算法:

匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。

在介绍
匈牙利算法之前还是先提一下几个概念,下面M是G的一个匹配。
M-交错路:p是G的一条通路,如果p中的边为属于M中的边与不属于M但属于G中的边交替出现,则称p是一条M-交错路。如:路径(X3,Y2,X1,Y4),(Y1,X2,Y3)。
M-饱和点:对于v∈V(G),如果v与M中的某条边关联,则称v是M-饱和点,否则称v是非M-饱和点。如X1,X2,Y1,Y2都属于M-饱和点,而其它点都属于非M-饱和点。
M-可
增广路:p是一条M-交错路,如果p的起点和终点都是非M-饱和点,则称p为M-可增广路。如(X3,Y2,X1,Y4)。(不要和流网络中的
增广路径弄混了)
求最大
匹配的一种
显而易见的算法是:先找出全部匹配,然后保留匹配数最多的。但是这个算法的
时间复杂度为边数的指数级
函数。因此,需要寻求一种更加高效的算法。下面介绍用
增广路求最大
匹配的方法(称作
匈牙利算法
匈牙利
数学家Edmonds于1965年提出)。
增广路的定义(也称增广轨或交错轨):
若P是图G中一条连通两个未
匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条
增广路径。

增广路的定义可以推出下述三个结论:
1-P的路径个数必定为奇数,第一条边和最后一条边都不属于M。
2-将M和P进行取反操作可以得到一个更大的
匹配M’。
3-M为G的最大
匹配当且仅当不存在M的
增广路径。
算法轮廓:
⑴置M为空
⑵找出一条
增广路径P,通过异或操作获得更大的
匹配M’代替M
⑶重复⑵操作直到找不出
增广路径为止
接下来说说这题,经典的最小顶点覆盖题;

题意:
鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他无法找到解决方案,速度不够快,那么他很伤心。
现在,他有以下的问题。
他必须捍卫一个中世纪的城市,形成了树的道路。
他把战士的最低数量的节点上,使他们可以观察所有的边。
你能帮助他吗?
士兵,鲍勃把一个给定的树,你的程序应该发现的最小数目。
输入文件包含多个数据集的文本格式。

题解:可以用匈牙利算法求解;用stl模版中的向量容器存放双向邻接表;

注意:1.本题中编号是从0开始;所以ret[]应初始化为-1;

2:向量要清零;

代码实现:

#include<stdio.h>
#include<cstring>
#include<vector>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define MAX 1505
int visit[MAX];//标记节点是否被访问过;
int ret[MAX];//标记n个节点的增广节点的编号
vector<int>map[MAX];//用stl模版中的向量存放邻接表
int find(int cur )//找增广路径
{
for(int i=0;i<map[cur].size();i++)
{
int j=map[cur][i];
if(!visit[j])//若j与cur相邻,且没有被标记
{
visit[j]=1;
if(ret[j]==-1||find(ret[j]))//如果j未在前一个匹配M中,或者,j在匹配M中,但从j相邻的节点出发可以找到增广路
{
ret[j]=cur;//则把cur放到匹配M中;
return 1;
}
}
}
return 0;
}
int main()
{
// freopen("input.txt","r",stdin);
int n,x,m,y;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)map[i].clear();//注意要清零;
for(int i=0;i<n;i++)
{
scanf("%d:(%d)",&x,&m);
for(int j=0;j<m;j++)
{
scanf("%d",&y);
map[x].push_back(y);//用向量存放双向邻接表
map[y].push_back(x);
}
}
int sum=0;
memset(ret,-1,sizeof(ret));//因为节点从0开始,所以要赋值为-1;
for(int i=0;i<n;i++)//
{
memset(visit,0,sizeof(visit));
sum+=find(i);//若有增广路,匹配数则加一
}
printf("%d\n",sum/2);//最小顶点覆盖 == 最大匹配(双向图)/2;
}
return 0;
}

HDU1054Strategic Game(最小顶点覆盖数)的更多相关文章

  1. poj3041-Asteroids , 二分图的最小顶点覆盖数 = 最大匹配数

    点击打开链接 Konig定理:二分图的最小顶点覆盖数 = 二分图的最大匹配数 题意: 在N*N的网络中有K颗小行星.小行星i的位置是(Ri, Ci).如今有一个强力的武器可以用一发光束将一整行或一整列 ...

  2. Ural 1109 Conference(最小路径覆盖数)

    题意:A国家有M个代表,B国有N个代表,其中有K对代表可以进行谈判(一个是A国的,一个是B国的),并且每一个代表至少被包含在其中一对中(也就是说,每个人可以至少找到另外一个人谈判),每一对谈判需要一对 ...

  3. POJ - 1422 Air Raid(DAG的最小路径覆盖数)

    1.一个有向无环图(DAG),M个点,K条有向边,求DAG的最小路径覆盖数 2.DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数 3. /* 顶点编号从0开始的 邻接矩阵(匈牙利算 ...

  4. HDU -1151 二分匹配与有向无环图不相交最小路径覆盖数

    题意: 考虑一个小镇,那里的所有街道都是单向的,并且每条街道都从一个路口通往另一个路口.还众所周知,从一个十字路口开始,穿过城镇的街道,您将永远无法到达同一十字路口,即,城镇的街道没有环. 基于这些假 ...

  5. 50 years, 50 colors HDU - 1498(最小点覆盖或者说最小顶点匹配)

    On Octorber 21st, HDU 50-year-celebration, 50-color balloons floating around the campus, it's so nic ...

  6. NBUT 1635 Explosion(最小顶点覆盖)

    [1635] Explosion 时间限制: 10000 ms 内存限制: 65535 K 问题描述 there is a country which contains n cities connec ...

  7. hdu1054最小顶点覆盖

    最小定点覆盖是指这样一种情况: 图G的顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点.我们称集合V覆盖了G的边.最小顶点覆盖是用最少的顶点来覆盖所有的边.顶点覆盖数是最小顶点覆盖 ...

  8. HDU 3360 National Treasures(最小点覆盖)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3360 题目大意: 在一个n*m的格子中,每个格子有一个数值,-1表示空,其余表示财宝.每个财宝的数值转 ...

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

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

随机推荐

  1. Web开发常见的漏洞

    SQL注入漏洞 跨站脚本攻击漏洞 登陆后台管理页面 IIS短文件/文件夹漏洞 系统敏感信息泄露

  2. 伪元素content的应用

    日常开发中,我们常用:before,:after来实现一些效果,比如 – 边框 – 图标 此时的content中只是为了伪元素能渲染出来而声明 1 2 3 div:before{ content: & ...

  3. JavaScript 高级程序设计 02-变量、数据类型

    一.JavaScript变量 1.变量的定义 在定义变量时,统一使用关键字var,后跟变量名(即标识符,如果不知道什么是标识符,可以到这去查看),如下 var message; //定义一个变量 注意 ...

  4. 破解网络投票IP限制、验证码限制、COokie限制、Seesion限制的方法!(转)

    顾名思义,网络投票就是在网络上进行的投票活动,但和其他类型的投票不同的是:网络投票是建立在网络投票系统上的,而结果完全由程序输出,无需人工参与.这既是网络投票系统的优点也是其缺点,没有了人工的参与,其 ...

  5. ajax post 时 form数据serialize()

    $.post(UrlAddData, $(".AddForm").serialize(), function (data) { if (data.result) { $.liger ...

  6. NativeExcel 读取文件

    class function T_EShopDataBill.ImportData(const AFileName: String; AList: T_EShopDataModelList; var ...

  7. c语言指针说解

    一. 指针定义 1指针的意义 2指针的赋值 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值.未经赋值的指针变量不能使用, 否则将造成系统混乱. #include <std ...

  8. ASP.NET 页面传值得9种方式

    1. Get(即使用QueryString显式传递)     方式:在url后面跟参数.     特点:简单.方便.     缺点:字符串长度最长为255个字符:数据泄漏在url中.     适用数据 ...

  9. grunt项目配置

    安装完CLI,还要在项目安装Grunt npm install -g grunt-cli npm install grunt --save-dev 源码放在src下 package.json放在根目录 ...

  10. Java类加载器加载类顺序

    java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class形式,然后由java虚拟机(JVM)解释执 行,.class字节码文 ...