二分匹配02-最大独立集,最小路径覆盖,二分图的最大团的基础理解

在这之前说一下由于这些大部分也都是在最大匹配基础上更改的,所以对于二分匹配的最大匹有不了解可以先看最大匹配
链接地址:https://blog.csdn.net/weixin_44606952/article/details/99647715
对于各类定理的模板我会在以后遇到的时候把模板解题样例链接依次发到对应含义解说的下面;
最大独立集:它的含义就是选出最多的点,但是所选出的任意两点之间均不能相互连接;
最小点覆盖数=最大匹配数;
最大独立集=顶点数-最小点覆盖数
最大独立集模板代码:(实际就是按照定义上面的定义写的)

#include<stdio.h>
#include<string.h>
int e[205][205],book[205];
int match[205];
int n,m;
int dfs(int u)
{
    for(int i=1; i<=m; ++i)
    {
        if(e[u][i]==1&&book[i]==0)
        {
            book[i]=1;
            if(match[i]==0||dfs(match[i]))
            {
                match[i]=u;
                printf("%d %d\n", u,i);
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int a,b,k,t=0;
   while(scanf("%d %d %d",&n,&m,&k),n!=0&&m!=0&&k!=0)
   {
        memset(e,0,sizeof(e)); 
	    int sum=0;
        for(int i=1; i<=k; i++)
        {
            scanf("%d %d",&a,&b);
            e[a][b]=1;
        }
        memset(match,0,sizeof(match));
        for(int i=1; i<=n; i++)
        {
            memset(book,0,sizeof(book));
            if(dfs(i))
                sum++;
        }
        printf("Case %d: %d\n",++t,n+m-sum);
    }
    return 0;
}

最小路径路径覆盖:相交表示的意思是每一条路所经过的顶点都不相同即一个顶点不能出现在多条路径中(另外单个顶点也可以作为一条路径只是路径的长度为0罢了)
例如这样一张图:
在这里插入图片描述
要是不相交路径的话就分为三条路径覆盖1->3->4;和2;5;
要是相交路径顾名思义一个顶点可以在多条路径中出现所以有两条路径1->3->4和2->3->5;
最小路径覆盖=顶点数-最大匹配数;
下面是不相交路径覆盖的代码(与上一个代码来说基本无差)
输入样例 :
3 3 4
1 1
1 2
1 3
2 3
输出样例:
4

#include<stdio.h>
#include<string.h>
int e[205][205],book[205];
int match[205];
int n,m;
int dfs(int u)
{
    for(int i=1; i<=m; ++i)
    {
        if(e[u][i]==1&&book[i]==0)
        {
            book[i]=1;
            if(match[i]==0||dfs(match[i]))
            {
                match[i]=u;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int a,b,k,t=0;
   while(scanf("%d %d %d",&n,&m,&k),n!=0&&m!=0&&k!=0)
   {
        memset(e,0,sizeof(e)); 
	    int sum=0;
        for(int i=1; i<=k; i++)
        {
            scanf("%d %d",&a,&b);
            e[a][b]=1;
        }
        memset(match,0,sizeof(match));
        for(int i=1; i<=n; i++)
        {
            memset(book,0,sizeof(book));
            if(dfs(i))
                sum++;
        }
        printf("Case %d: %d\n",++t,n+m-sum);
    }
    return 0;
}

二分图的最大团:
对于一般图来说,团是一个顶点集合,且由该顶点集合诱导的子图是一个完全图,简单说,就是选出一些顶点,这些顶点两两之间都有边。最大团就是使得选出的这个顶点集合最大。
方法一:
我们默认为左边的所有点之间都有边,右边的所有顶点之间都有边。那么,实际上,我们是要在左边找到一个顶点子集X,在右边找到一个顶点子集Y,使得X中每个顶点和Y中每个顶点之间都有边。
方法二:
二分图的最大团=补图的最大独立集。
补图的定义是:对于二分图中左边一点x和右边一点y,若x和y之间有边,那么在补图中没有,否则有。
这个方法很好理解,因为最大独立集是两两不相连,所以最大独立集的补图两两相连。
下面一条链接是在二分图最大团的一道例题:
也可以说是最大团的一种解题思路吧:
https://blog.csdn.net/weixin_44606952/article/details/99677592

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮皮皮皮皮皮卡乒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值