poj 1274 The Perfect Stall 解题报告

题目链接:http://poj.org/problem?id=1274

题目意思:有 n 头牛,m个stall,每头牛有它钟爱的一些stall,也就是几头牛有可能会钟爱同一个stall,问牛与 stall 最大匹配数是多少。

    二分图匹配,匈牙利算法入门题,留个纪念吧。

    书上看到的一些比较有用的知识点:

    增广:通俗地说,设当前二分图中,已有 x 个匹配边(也就是假设代码中match[i] 不为0的个数有x个),现在对 i 点(也就是代码中dfs中的参数 x) 指定一个匹配点 j, 由于 j 可能有匹配点设为 k(map[x][i]),必须要为k找到一个新匹配 (对应黑屏中的前两次增广,本来的match[2] 从 1 变为 2 了,因为要为牛2找stall ,遇到map[2][2]边的时候发现match[2] 有数,只能调用dfs(match[2]) 为 match[2]找另一个匹配,也就是map[1][5],发现能找到,于是match[5] = 1,match[2] 就顺利成章变为2了)。

      

      若能够找到,则表示匹配成功了x + 1 条边;若不能找到,相当于还是只有 x 个匹配边,只不过换了一种匹配方案而已,若达不到增加一条边的目的则称为对 i 增广不成功。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 
 6 using namespace std;
 7 const int maxn = 200 + 5;
 8 
 9 int map[maxn][maxn];
10 int match[maxn];   // match[m]存储了匹配的方案, match[i] = j :仓库i里是牛j
11 bool vis[maxn];
12 int n, m, cnt;
13 
14 int dfs(int x)  // 深搜找增广路径
15 {
16     for (int i = 1; i <= m; i++)
17     {
18         if (!vis[i] && map[x][i])  // 对x的每个邻接点
19         {
20             vis[i] = true;
21             if (match[i] == 0 || dfs(match[i]))  // 若 match[i] 点是一个初始值,表示i点原来没有匹配,则增广成功返回
22             {                                     // 或者 match[i]点能重新找到一个新的匹配点
23                 match[i] = x;                 // 保证新的匹配方案
24                 return 1;
25             }
26         }
27     }
28     return 0;
29 }
30 
31 void Hungary()
32 {
33     cnt = 0;
34     for (int i = 1; i <= n; i++)  // 对 n 个点依次进行增广
35     {
36         memset(vis, 0, sizeof(vis));
37         cnt += dfs(i);    // 增广成功,表示i点找到了一个匹配,多了一条匹配边
38     }
39 }
40 
41 int main()
42 {
43     int k, to;   // k: stall_num, to:stall_id
44     while (scanf("%d%d", &n, &m) != EOF)
45     {
46         memset(map, 0, sizeof(map));
47         memset(match, 0, sizeof(match));
48 
49         for (int i = 1; i <= n; i++)
50         {
51             scanf("%d", &k);
52             for (int j = 1; j <= k; j++)
53             {
54                 scanf("%d", &to);
55                 map[i][to] = 1;
56             }
57         }
58         Hungary();
59         printf("%d\n", cnt);
60     }
61 }

 

转载于:https://www.cnblogs.com/windysai/p/3916955.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值