二分图之最大匹配数算法(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;
}





相关文章
|
6月前
没有给出二分图两个左右点集时的二分图最大匹配
没有给出二分图两个左右点集时的二分图最大匹配
31 0
|
3月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
5月前
|
存储 算法 C语言
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
87 1
|
6月前
|
算法 Java C++
非启发式算法——二分、三分搜索算法
非启发式算法——二分、三分搜索算法
212 0
|
11月前
|
算法
图论算法(最短路、网络流、二分图)
图论算法(最短路、网络流、二分图)
101 0
|
算法 Java
单源最短路径【学习算法】
单源最短路径【学习算法】
77 0
|
算法
短小精悍的多源最短路径算法—Floyd算法
在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径。
406 0
短小精悍的多源最短路径算法—Floyd算法
|
机器学习/深度学习 存储 算法
算法之单源最短路径
算法之单源最短路径
129 0
算法之单源最短路径
|
算法
这是我见过讲的最清晰的迪杰斯特拉算法
这是我见过讲的最清晰的迪杰斯特拉算法
127 0
这是我见过讲的最清晰的迪杰斯特拉算法
|
算法
图论——二分图1:二分图以及判定
图,有有向图,无向图,稠密图,简单图······ 算法,有贪心法,二分法,模拟法,倍增法······   那,二分图是啥? 二分法+有向图?     于是,我查了许多资料,才对它有一定了解。   二分图:二分图,是图论中的一种特殊模型,设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且同一集合中不同的两点没有边相连。
1369 0