pku3692 Kindergarten

本文详细介绍了使用匈牙利算法解决二分图匹配问题的方法,并通过一个具体的POJ题目进行实例讲解。文中提供了完整的C语言代码实现,展示了如何求解最大独立集、最小点覆盖等问题。

http://poj.org/problem?id=3692

二分图匹配,匈牙利算法(dfs+邻接矩阵),最大独立集

最大独立集 == N - 最小点覆盖 == N - 最大匹配数

把没有关系的两点连接,反向建图

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define N 210
 5 
 6 int n, m, map[N][N], girl[N], flag[N];
 7 
 8 int find(int x)
 9 {
10     int i;
11     for(i=1; i<=m; i++)
12     {
13         if(!flag[i] && map[x][i])
14         {
15             flag[i] = 1;
16             if(girl[i]==-1 || find(girl[i]))
17             {
18                 girl[i] = x;
19                 return 1;
20             }
21         }
22     }
23     return 0;
24 }
25 
26 int hungary()
27 {
28     int i, j, sum = 0;
29     for(i=1; i<=n; i++)
30     {
31         for(j=1; j<=m; j++)
32         {
33             flag[j] = 0;
34         }
35         sum += find(i);
36     }
37     return sum;
38 }
39 
40 int main()
41 {
42     int i, j, k, cases;
43     for(cases=1; scanf("%d%d%d", &n, &m, &k), n||m||k; cases++)
44     {
45         for(j=1; j<=m; j++)
46         {
47             girl[j] = -1;
48             for(i=1; i<=n; i++)
49             {
50                 map[i][j] = 1;
51             }
52         }
53         while(k-- && scanf("%d%d", &i, &j))
54         {
55             map[i][j] = 0;
56         }
57         printf("Case %d: %d\n", cases, n + m - hungary());
58     }
59     return 0;
60 }

 

转载于:https://www.cnblogs.com/yuan1991/archive/2013/01/14/pku3692.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值