【HDOJ】2444 The Accomodation of Students

本文介绍了一种解决图论问题的方法,利用着色原理和二分图匹配来判断图是否可以进行二部着色,并计算最大匹配数。通过深度优先搜索实现着色与匹配的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图论的题目。着色原理+二分图匹配。

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 #define MAXN 205
 5 
 6 char map[MAXN][MAXN];
 7 int link[MAXN];
 8 int color[MAXN];
 9 bool visit[MAXN];
10 int n, m;
11 
12 bool dfs(int v, int col) {
13     int i;
14 
15     for (i=1; i<=n; ++i) {
16         if (map[i][v]) {
17             if (color[i] == col)
18                 return false;
19             else if (color[i] == 0) {
20                 color[i] = -col;
21                 if (dfs(i, -col) == false)
22                     return false;
23             }
24         }
25     }
26     return true;
27 }
28 
29 bool find(int v) {
30     int i;
31 
32     for (i=1; i<=n; ++i) {
33         if (!visit[i] && map[i][v]) {
34             visit[i] = true;
35             if (link[i]==0 || find(link[i])) {
36                 link[i] = v;
37                 return true;
38             }
39         }
40     }
41     return false;
42 }
43 
44 int main() {
45     int ans;
46     int i, j;
47 
48     while (scanf("%d%d", &n, &m) != EOF) {
49         memset(map, 0, sizeof(map));
50         memset(link, 0, sizeof(link));
51         memset(color, 0, sizeof(color));
52         while (m--) {
53             scanf("%d %d", &i, &j);
54             map[i][j] = map[j][i] = 1;
55         }
56         color[1] = 1;
57         if (dfs(1, 1) == false) {
58             printf("No\n");
59             continue;
60         }
61         for (ans=0, i=1; i<=n; ++i) {
62             memset(visit, false, sizeof(visit));
63             if (find(i))
64                 ++ans;
65         }
66         printf("%d\n", ans/2);
67     }
68 
69     return 0;
70 }

 

转载于:https://www.cnblogs.com/bombe1013/p/3905747.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值