二分图相关问题:
1.二分图的最大匹配
在两个集合中找出最大的匹配数
用MAP来存两个集合之间的关系,p表示与i的匹配对象。
bool used[110];
int p[110];
bool MAP[1010][1010];
int num,n,m,len,t,v;
bool work(int c)
{
for(int i = 1; i <= m; i++)
{
if(!used[i] && MAP[c][i])
{
used[i] = true;
if(p[i]==-1 || work(p[i]))
{
p[i] = c;
return true;
}
}
}
return false;
}
void sol()
{
num=0;
for(int i = 1; i <= n; i++)
{
memset(used,0,sizeof(used));
if(work(i))
num++;
}
}
2.最小点覆盖问题
寻找一个点集使图中每一条边至少有一点在此集合内
二分图的最小覆盖=二分图的最大匹配
例:
姑姑想要了解之前所有相亲的情况。对于任一个一次相亲,只要跟参与相亲的两人交流就可以得到这次相亲的情况。如果一个人参加了多次相亲,那么跟他交流就可以知道这几次相亲的情况。那么问题来了,挖掘技术到底哪家强姑姑最少需要跟多少人进行交流可以了解到所有相亲的情况
。(http://hihocoder.com/problemset/problem/1127)
3.最小路径覆盖
最小路径覆盖问题:用尽量少的不相交简单路径覆盖有向无环图的所有顶点
将每个顶点分为两个,分别在X集合和Y集合
POJ 1422
有N个城市及M条道路,道路是有向的且道路不形成环。现在要求派一些伞兵空降在某些城市,然后这些伞兵可以沿着道路访问到其他城市,但是不能有两个或两个以上伞兵访问同一个城市。
问要达到上述要求,至少需要多少伞兵?
4.最大独立集
可以这样理解,在总的点集中,去掉最少的点,使得剩下的点相互之间没有边。用最少的点去覆盖所有的边,也就是最小覆盖。
因为春节快要结束了,姑姑打算给这些人再安排一次集体相亲。集体相亲也就是所有人在一起相亲,不再安排一对一对的进行相亲。但是姑姑有个条件,要求所有参与相亲的人之前都没有见过。也就是说在之前的每一次相亲中的两人不会被同时邀请来参加这次集体相亲。那么问题又来了,姑姑最多可以让多少人参与这个集体相亲。