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





相关文章
|
4月前
没有给出二分图两个左右点集时的二分图最大匹配
没有给出二分图两个左右点集时的二分图最大匹配
12 0
|
4天前
|
机器学习/深度学习 人工智能 算法
【图论 单源最短路】100276. 最短路径中的边
【图论 单源最短路】100276. 最短路径中的边
|
13天前
|
算法
最小生成树算法
最小生成树算法
|
3月前
|
算法 Java C++
非启发式算法——二分、三分搜索算法
非启发式算法——二分、三分搜索算法
75 0
|
9月前
|
算法 Java
单源最短路径【学习算法】
单源最短路径【学习算法】
50 0
|
10月前
|
存储 算法
最短路Johnson算法
最短路Johnson算法
76 0
|
11月前
|
算法 搜索推荐
从图到算法【图论】
柯尼斯堡七桥问题是图论中的著名问题。
61 0
|
存储 算法 C++
秒懂算法 | 图论
图论是一个“巨大”的专题,有大量的知识点,有众多广为人知的问题,有复杂的应用场景。 图论算法常常建立在复杂的数据结构之上。本文讲解了基础的图论考点,帮助大家了解图论专题
171 0
|
算法
短小精悍的多源最短路径算法—Floyd算法
在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径。
357 0
短小精悍的多源最短路径算法—Floyd算法
最短路模型(二)
AcWing 188. 武士风度的牛
301 0
最短路模型(二)