给出两组男女小朋友,期中男的和女的个子都互相认识,然后再给出几组男女之间认识的组,问最后求出最大的互相都认识的人数
经典的最大团问题,
求二分图的最大完全图=补图的最大孤立团=N-补图的最大二分匹配
最小路径覆盖。
有向图最小路径覆盖=|V| - 最大匹配数; 无向图最小路径覆盖=|V| - 最大匹配数/2。
给你顶点和顶点,求最少的
转载一个解题报告,比较详细的]
1 #include <stdio.h>
2 #include <string.h>
3 #define N 202
4 int gn,bn;
5 int match[N],map[N][N];
6 bool used[N];
7 int find(int x)
8 {
9
10 for(int i=1; i<=bn; i++)
11 if( !used[i] && map[x][i] == 0 )
12 {
13 used[i] = 1;
14 if( match[i]==-1 || find(match[i]) )
15 {
16 match[i] = x;
17 return 1;
18 }
19 }
20 return 0;
21 }
22
23 int Hungry()
24 {
25 int sum=0;
26
27 for(int j=1;j<=gn;j++)
28 {
29 memset(used,false,sizeof(used));
30 if(find(j))sum++;
31 }
32 return sum;
33 }
34 int main()
35 {
36 int gg,bb,m,ca=1;
37 while(scanf("%d%d%d",&gn,&bn,&m)!=EOF)
38 {
39 if(gn==bn&&bn==m&&m==0)break;
40 memset(match,-1,sizeof(match));
41 memset(map,0,sizeof(map));
42 for(int i=0;i<m;i++)
43 {scanf("%d%d",&gg,&bb);
44 map[gg][bb]=1;}
45 int ans=Hungry();
46 printf("Case %d: %d\n",ca++,gn+bn-ans);
47 }
48 }
49 /*
50
51 独立集:任意两点都不相连的顶点的集合
52 独立数:独立集中顶点的个数
53
54 完全子图:任意两点都相连的顶点的集合
55 最大完全数:最大完全子图中顶点的个数
56
57 最大完全数=原图的补图的最大独立数
58 最大独立数=顶点数-最大匹配数
59
60 这样,就可以求出最大完全数
61 完全图G就是指图G的每个顶点之间都有连边。
62 这样,令完全图G的阶|G|=N,那么完全图G具有如下性质:
63 1.图G有(N-1)*N/2条边。
64 2.图G上的生成树有N^(N-2)种。
65 3.★图G的补图G'中没有边。
66
67 由此可以引发一个很简单的定理:
68 ★一个图T的一个完全子图G,对应它的补图T'上的一个独立集。
69
70 那么求一个图的最大完美子图就等价于它的补图的最大独立集所包含的点的个数。
71 于是我们可以用匹配算法解决。
72 */