以下内容如有问题,还望大家提出意见来,大家一起进步^_^
以下为二分图的模板
void init()
{
memset(link,-1,sizeof(link));//初始化链接的点为-1
for(int i = 0;i < n;i ++)//是用vector存储图的点之间的关系的
{
pro[i].clear();
}
}
bool can(int x)//寻找二分图的增广路
{
int len = pro[x].size();
for(int i = 0;i < len;i ++)
{
int t = pro[x].at(i);
if(!vis[t])
{
vis[t] = 1;
if(link[t] == -1 || can(link[t]))//当前点还没有匹配或者当前点可以找到其他的匹配点,就与x匹配
{
link[t] = x;
return true;
}
}
}
return false;
}
int maxmatch()
{
int num = 0;
for(int i = 0;i < n;i ++)
{
memset(vis,0,sizeof(vis));//在这儿批量赋值
if(can(i))//找到增广路就加一
{
num ++;
}
}
return num;//获得匹配的点的数目
}
最大独立点=点数-最大匹配数 hdu Girls and Boys
最小点覆盖=匹配数 hdu Strategic Game
最小路径覆盖=点数-最大匹配数 hdu Air Raid
二分图匹配的模板是固定的,但是要将一些题目要细细分析,分解成二分图模型,就好用二分图了
hdu Machine Schedule简单的二分图匹配,但是要注意题目中的细节“At the beginning they are both work at mode_0”
hdu Uncle Tom's Inherited Land*是有点变形的二分图匹配,如果能够想到是二分图匹配应该可以做出来-----我的博客上面有
hdu Card Game Cheater只是二分图匹配+字符串处理,我的博客上面有
hdu 棋盘游戏 这一题有点转弯,我是模仿别人写的,之前思路出问题了,看了别人的代码才明白------代码我的博客上面有
hdu Cat vs. Dog有点转弯,需要拿人来匹配,喜欢A的人和讨厌A的人匹配,求最大独立点 ------博客上面有