二分图之最大匹配数算法(Kindergarten)

简介: 二分图之最大匹配数算法(Kindergarten)

最近又新学了一个算法叫二分匹配,其中有最大匹配数,最大独立集,最大顶点覆盖数、最大团等,不过还有的没有看懂(会看懂的,慢慢来)。

最大匹配数:最大匹配数指男女之间有关系的人最大匹配的个数是多少?

如:一共三男三女,一共有五种关系,分别是:

1 1’ ———— //一号女生和一号男生认识

1 2’ ————//一号女生与二号男生认识

2 2’ ————//二号女生与二号男生认识

2 3’ ————//二号女生和三号男生认识

3 1’ ————//三号女生和一号男生认识

求他们之间相互认识的最大匹配是多少?

模板代码:

#include<stdio.h>
#include<string.h>
int e[101][101];
int match[101],book[101];
int n,m;
int dfs(int u)
{
  int i;
  for(i=1;i<=n;i++)
  {
    if(book[i]==0&&e[u][i]==1)表示第i号男生没有匹配,且与u号女生认识
    {
      book[i]=1;//标记
      if(match[i]==0||dfs(match[i])==1)//如果点i未被标记或者找到了新的匹配
      {
        match[i]=u;//更新配对关系
        return 1;
      }
    }
  }
  return 0;
} 
int main()
{
  int i,j,t1,t2,sum=0;
  scanf("%d%d",&n,&m);
  for(i=1;i<=m;i++)
  {
    scanf("%d%d",&t1,&t2);
    e[t1][t2]=1;
  }
  mamset(match,0,sizeof(match));
  for(i=1;i<=n;i++)
  {
    memset(book,0,sizeof(book));//清空上次搜索时的标记
    if(dfs(i))
      sum++;
  }
  printf("%d\n",sum);
  return 0;
}
/*
6 5
1 4
1 5
2 5
2 6
3 4
*/

以下是一个例题讲解最大团:

题目: Kindergarten


In a kindergarten, there are a lot of kids. All girls of the kids know each other and all boys also know each other. In addition to that, some girls and boys know each other. Now the teachers want to pick some kids to play a game, which need that all players know each other. You are to

help to find maximum number of kids the teacher can pick.

Input

The input consists of multiple test cases. Each test case starts with a line containing three integers

G, B (1 ≤ G, B ≤ 200) and M (0 ≤ M ≤ G × B), which is the number of girls, the number of boys

and

the number of pairs of girl and boy who know each other, respectively.

Each of the following M lines contains two integers X and Y (1 ≤ X≤ G,1 ≤ Y ≤ B), which

indicates that girl X and boy Y know each other.

The girls are numbered from 1 to G and the boys are numbered from 1 to B.

The last test case is followed by a line containing three zeros.

Output

For each test case, print a line containing the test case number( beginning with 1) followed by a integer which is the maximum number of kids the teacher can pick.

Sample Input

2 3 3
1 1
1 2
2 3
2 3 5
1 1
1 2
2 1
2 2
2 3
0 0 0

Sample Output

Case 1: 3
Case 2: 4

解题思路:这个题是让算出两两之间都认识的最大的人数,也就是最 大团 的问 题 , 最大团=顶点数 - 最大独立集。

程序代码:

#include<iostream>
#include<string.h>
int e[2000][2000],match[5000],book[5000];
int n,m;
using namespace std;
int dfs(int u);
int main()
{
  int i,j,t1,t2,sum,k;
  int cas=1;
  while(cin>>n>>m>>k)
  {
    sum=0;
    if(n==0&&m==0&&k==0)
      break;
    memset(e,0,sizeof(e));
    for(i=1;i<=k;i++)
    {
      scanf("%d%d",&t1,&t2);
      e[t1][t2]=1;
    }
      memset(match,0,sizeof(match));
      for(i=1;i<=n;i++)
      {
        memset(book,0,sizeof(book));
        if(dfs(i))
          sum++;
      }
      printf("Case %d: %d\n",cas++,n+m-sum);
  }
  return 0;
}
int dfs(int u)
{
  int i;
  for(i=1;i<=m;i++)
  {
    if(book[i]==0&&e[u][i]==0)//匹配去寻找互相不认识的人
    {
      book[i]=1;
      if(match[i]==0||dfs(match[i]))
      {
        match[i]=u;//两两不认识的人匹配
        return 1;
      }
    }
  }
  return 0;
}





相关文章
|
Kubernetes Cloud Native Apache
基于 Kubernetes 部署 Zookeeper,太有意思了!
随着云原生化流行的大趋势,我们的基础组件也需要逐渐上Kubernetes了。Apache Zookeeper作为目前最流行的分布式协调组件,在我们的微服务架构中负责扮演注册中心的角色。
基于 Kubernetes 部署 Zookeeper,太有意思了!
|
前端开发 容器
box—sizing 属性的了解
box—sizing 属性的了解
316 0
|
JavaScript 应用服务中间件 nginx
Windows安装hexo并配置nginx
Windows安装hexo并配置nginx
163 1
|
数据采集 监控 BI
C#实验室检验LIS信息系统源码 微生物检验、质控维护
LIS系统的主要目标是为检验室开展检验工作提供更加有效的系统支持。该系统将尽量减少以人工操作的方式来实现信息转移,减少在接收检验项目、报告结果和保存记录等工作中可能会出现的人为误差,为检验结果查询提供更有效的方法,节省了管理信息所需的琐碎时间和精力。为实验室技术人员提供智能化的运行模式,使处理诸如按照规程审核检验结果、取消检验项目、分析、处理存在重大疑问的检验结果、执行特殊的命令和处理质量控制等问题更轻松自如,这将使检验人员更快地获得准确清晰的检验结果。为临床医护人员提供在线设施,使他们可以及时准确地获得相关实验室信息。确保检验结果的可靠性和准确性,利用实验室管理信息系统的仪器监控和质量控制,
167 0
|
监控 Unix 数据处理
Grep命令的高级用法与实用技巧
Grep命令的高级用法与实用技巧
|
XML 前端开发 Java
Spring Boot与Spring MVC的区别和联系
Spring Boot与Spring MVC的区别和联系
|
JSON 中间件 数据格式
Gin框架学习笔记(六)——gin中的日志使用
Gin框架学习笔记(六)——gin中的日志使用
907 0
|
开发工具 git
git blame
git blame 是一个 Git 命令,用于显示某个文件中每一行代码的修改历史。它会显示每行代码的最后一次修改者、修改日期和修改内容。通过 git blame 命令,你可以轻松追踪代码的修改记录,了解团队成员在开发过程中的协作情况。
426 10
|
消息中间件 存储 Java
阿里二面:RocketMQ 消费失败了,怎么处理?
阿里二面:RocketMQ 消费失败了,怎么处理?
725 2
阿里二面:RocketMQ 消费失败了,怎么处理?
|
监控 数据可视化 Java
SpringCloud学习(十五):Hystrix图形化Dashboard搭建与实战
SpringCloud学习(十五):Hystrix图形化Dashboard搭建与实战
338 0
SpringCloud学习(十五):Hystrix图形化Dashboard搭建与实战