[ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)

描述

农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术。不幸的是,由于工程问题,每个牛栏都不一样。第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶。上个星期,农夫约翰刚刚收集到了奶牛们的爱好的信息(每头奶牛喜欢在哪些牛栏产奶)。一个牛栏只能容纳一头奶牛,当然,一头奶牛只能在一个牛栏中产奶。

给出奶牛们的爱好的信息,计算最大分配方案。

格式

PROGRAM NAME: stall4

INPUT FORMAT:

(file stall4.in)

第一行 两个整数,N (0 <= N <= 200) 和 M (0 <= M <= 200) 。N 是农夫约翰的奶牛数量,M 是新牛棚的牛栏数量。

第二行到第N+1行 一共 N 行,每行对应一只奶牛。第一个数字 (Si) 是这头奶牛愿意在其中产奶的牛栏的数目 (0 <= Si <= M)。后面的 Si 个数表示这些牛栏的编号。牛栏的编号限定在区间 (1..M) 中,在同一行,一个牛栏不会被列出两次。

OUTPUT FORMAT:

(file stall4.out)

只有一行。输出一个整数,表示最多能分配到的牛栏的数量.

SAMPLE INPUT

5 5
2 2 5
3 2 3 4
2 1 5
3 1 2 5
1 2

SAMPLE OUTPUT

4


^_^:本文参阅http://comzyh.tk/blog/archives/148/  COMZYH的博客(不错的博客哦!推荐)

^_^:解决最大二分匹配问题可以用网络流的最大流实现,不过最大流比较复杂,使用匈牙利算法编程较简单:

^_^:匈牙利算法核心思路: 

  1. 置边集M为空(初始化,谁和谁都没连着)
  2. 选择一个新的原点寻找增广路
  3. 重复(2)操作直到找不出增广路径为止(2,3步骤构成一个循环)
^_^:匈牙利算法过程演示:

  1. 初始化(清空)
  2. 从A所连接的点中找到一个未在本次循环中搜索过的点2,并将2标记为搜索过,因为2没有被连接过,匹配A2
  3. 结束上次,开始新的循环,将所有点标记为未搜索过
  4. 搜索B,找到一个未在本次循环中搜索过的点2,标记为搜索过
  5. 发现2被匹配过,从2的父亲A寻找增广路,递归搜索A{从A所连接的点中找到一个未在本次循环中搜索过的点5(1已经标记为绿色),将5标记为搜索过,因为5没有被匹配过,匹配A5}找到增广路(此处为增广路的关键
  6. 结束上次,开始新的循环,将所有点标记为未搜索过
  7. 搜索C,找到一个未在本次循环中搜索过的点1,并将1标记为搜索过,发现1未被匹配过,匹配C1
  8. 结束上次,开始新的循环,将所有点标记为未搜索过
  9. 搜索D,找到一个未在本次循环中搜索过的点1,并将1标记为搜索过,发现1被匹配过,递归搜索1的源C寻找增广路
  10. {搜索C,找到一个未在本次循环中搜索过的点5,标记为搜索过,发现5被匹配,进一步返现没有其他可连接点,返回找不到增广路}返回第9步
  11. 搜索D,找到一个未在本次循环中搜索过的点2,发现2被匹配,递归搜索2的源B寻找增广路
  12. {搜索B,找到一个未在本次循环中搜索过的点3,并将3标记为搜索过,发现3未被匹配,匹配B3返回找到}既然B另寻新欢,匹配D2
  13. 结束上次,开始新的循环,将所有点标记为未搜索过,递归搜索D寻找增广路
  14. 搜索E,找到一个未在本次循环中搜索过的点2,并将2标记为搜索过,发现2被匹配过,递归搜索2的源D寻找增广路
  15. {搜索D,发现1,5均被匹配过,返回找不到增广路}
  16. E无其他可连接节点,放弃E,E后无后续节点,已经遍历A-E,结束算法

 

 1 #include <iostream>
 2 #include <stdlib.h>
 3 #include <memory.h>
 4 using namespace std;
 5 int tab[201][201];//邻接矩阵,不是真正意义的邻接矩阵,第一维对应牛,第二维对应牛棚
 6 int state[201],result[201];//stata:是否被搜索过;result:某牛栏对应的牛
 7 int n,m;
 8 int ans;//找到多少匹配
 9  
10 int find(int x){// 匈牙利算法
11     for(int i=1;i<=m;i++){
12         if(tab[x][i]==1 && !state[i]){
13            state[i]=1;//标记为搜索过
14            if(result[i]==0 || find(result[i])){//未被匹配过&&能找到一条增广路
15               result[i]=x;//匹配i,x
16               return 1;//能找到新的匹配
17            }
18         }
19     }
20     return 0;
21 }
22 int main(){
23     int n1,t;
24     cin>>n>>m;
25     memset(tab,0,sizeof(tab));
26     for(int i=1;i<=n;i++){
27         cin>>n1;
28         for(int j=1;j<=n1;j++){
29             cin>>t;
30             tab[i][t]=1;
31         }
32     }
33     for(int i=1;i<=n;i++){
34         memset(state,0,sizeof(state));//清空是否搜索过数组
35         if(find(i)) ans++;//找到新的匹配
36     }//完成后Result[i]保存着第i个牛栏对应的奶牛,本题不用输出,其他题有可能用
37     cout<<ans<<endl;
38     return 0;
39 }

 

转载于:https://www.cnblogs.com/zjutlitao/p/3528203.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神奇的交际圈!这位17世纪的法国神父结交的好朋友,竟然都是一流数学牛人:笛卡尔、费马、加森迪······

全世界只有3.14 % 的人关注了爆炸吧知识话说&#xff0c;在近代数学史上&#xff0c;人们惊讶地发现17至18世纪的法国竟然产生了众多一流的数学家。然而&#xff0c;最早想到要培养一波优秀人才的&#xff0c;成就这段群星璀璨的传奇历史&#xff0c;并非是君王。而是出自于一位…

[原创]FineUI秘密花园(二十七) — 窗体控件概述(上)

窗体控件在项目中使用非常频繁&#xff0c;同时窗体控件和启用IFrame的面板控件也一起构成了FineUI所特有的内联框架&#xff0c;从而使弹出窗体不再局限于IFrame页面中。本章我们会详细介绍窗体控件的基本用法。 创建窗体控件 在页面中声明窗体控件标签&#xff0c;并设置需要…

Android之AIDL使用详解

1.什么是aidl:aidl是 Android Interface definition language的缩写&#xff0c;一看就明白&#xff0c;它是一种android内部进程通信接口的描述语言&#xff0c;通过它我们可以定义进程间的通信接口 icp:interprocess communication :内部进程通信 2.既然aidl可以定义并实现进…

用php打印九九乘法表,php如何打印出九九乘法表呢?

摘要:下文讲述使用php代码在页面上输出九九乘法表的示例分享&#xff0c;如下所示&#xff1b;实现思路:主要使用遍历的方式输出九九乘法表例:php 循环输出九九乘法表echo "maomao365.com 示例分享\n";echo "for 循环打印出九九乘法表";for($j1; $j<9; …

他言行不一屡次跳槽,还升职加薪走上了人生巅峰,全数学界都炸了......

全世界只有3.14 % 的人关注了爆炸吧知识看在大家都这么爱学习的份上&#xff0c;今天小天就和大家介绍一名老师吧&#xff01;这位老师就是亚历山大.雅科夫列奇.辛钦&#xff01;家庭教育好&#xff0c;学霸就有了亚历山大.雅科夫列奇.辛钦&#xff0c;1894年出生于前苏联莫斯科…

IoTSharp部署教程-Sqlite分表篇

IoTSharp的部署环境极其灵活&#xff0c;我们推荐使用Docker方式进行部署&#xff0c; 这减少了很多配置&#xff0c; 首先最简单的部署当然属于 Sqlite 数据库&#xff0c; 且不适用任何外部依赖。 在生产环境中&#xff0c; 我们需要配置 appsettings.Production.json 文件&a…

Android之AsyncTask两种线程池分析和总结

Android AsyncTask两种线程池分析和总结(一) 前言在android AsyncTask里面有两种线程池供我们调用1&#xff0e; THREAD_POOL_EXECUTOR, 异步线程池2&#xff0e; SERIAL_EXECUTOR&#xff0c;同步线程池正如上面名称描述的那样&#xff0c;一个是异步线程池&#xff…

一款好的折线图、饼图、柱形图

链接地址http://www.highcharts.com/demo/line-basic/skies http://www.highcharts.com/demo/转载于:https://www.cnblogs.com/blueking/p/3530787.html

被遗忘的数学家!曾提出最接地气的数学定理,可以计算男朋友真不真心的那种......

全世界只有3.14 % 的人关注了爆炸吧知识在介绍了业余数学家费马后&#xff0c;听说很多小伙伴还想看看业余的。这不&#xff0c;小天这次又来介绍业余数学家来了。险些被遗忘托马斯.贝叶斯&#xff0c;十八世纪英国的一个长老会的牧师&#xff08;专业&#xff09;和数学家&…

Android之MVVM框架 - 数据绑定

本教程是跟着 Data Binding Guide 学习过程中得出的一些实践经验&#xff0c;同时修改了官方教程的一些错误&#xff0c;每一个知识点都有对应的源码&#xff0c;争取做到实践与理论相结合。 Data Binding 解决了 Android UI 编程中的一个痛点&#xff0c;官方原生支持 MVVM 模…

再见 Typora,这款 Markdown 编辑器开源又免费!

推荐一个免费开源的 Markdown 编辑器编程导航 致力于推荐优质编程资源 &#x1f48e;项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️哈喽大家好&#xff01;我是编程导航的小编火宝。前段时间 Typora 宣布将升级并开始收费&#xff0c;想必大家…

Android窗口管理服务WindowManagerService的简要介绍和学习计划

在前一个系列文章中&#xff0c;我们从个体的角度来分析了Android应用程序窗口的实现框架。事实上&#xff0c;如果我们从整体的角度来看&#xff0c;Android应用程序窗口的实现要更复杂&#xff0c;因为它们的类型和作用不同&#xff0c;且会相互影响。在Android系统中&#x…

Andorid之为何要用到NDK?

概括来说主要分为以下几种情况&#xff1a; 1. 代码的保护&#xff0c;由于apk的java层代码很容易被反编译&#xff0c;而C/C库反汇难度较大。 2. 在NDK中调用第三方C/C库&#xff0c;因为大部分的开源库都是用C/C代码编写的。 3. 便于移植&#xff0c;用C/C写得库可以方便在其…

日本最惨数学天才!37岁裸辞,房子被政府没收,向全村人乞讨,一家五口只能吃野菜.........

全世界只有3.14 % 的人关注了爆炸吧知识数学是火他是飞蛾多年以后&#xff0c;当冈熙哉站在桥本市的数学家纪念碑前&#xff0c;准会想起父亲请他吃面包片的那个遥远的夜晚。当时&#xff0c;他们一家五口蜗居在邻居施舍租出的小库房里。冈洁家三代同堂在他的回忆中&#xff0c…

3、Eternal框架-控制器

2019独角兽企业重金招聘Python工程师标准>>> 介绍 MVC&#xff1a;Model-View-Controller&#xff0c;包括三类对象&#xff0c;Model模型对象、View视图表示、Controller控制器。在应用MVC方式以前&#xff0c;通常将这三个对象的功能合到了一起&#xff0c;通过分…

java配置JDK

1、将JDK文件拷入电脑并解压缩 根据系统版本选择JDK版本&#xff0c;并将eclipse解压缩 2、配置系统环境变量 右键我的电脑--属性--高级系统设置--环境变量 新建JAVA_HOME如图所示&#xff08;严格区分大小写&#xff09; 修改环境变量Path 在变量值一栏的最前面加上%JAVA_HOM…

可怕!原来我们看到的世界地图一直都是“错”的!多年的地理白学了...

▲ 点击查看几乎每个家庭都会有两张地图&#xff1a;一张世界地图&#xff0c;一张中国地图。薄薄的两张纸&#xff0c;蕴藏着让每个人学会“看世界”的磅礴力量。哈佛上一任校长&#xff0c;也是300多年来唯一一位女校长德鲁吉尔平福斯特&#xff08;Drew Gilpin Faust&#x…

.NET 程序测试 Java 项目 log4j2 是否存在远程代码执行漏洞

最近两天被朋友圈的“Apache Log4j2 远程代码执行漏洞”刷屏了&#xff0c;主要是因为组件存在 Java JNDI 注入漏洞&#xff1a;当程序将用户输入的数据记入日志时&#xff0c;攻击者通过构造特殊请求&#xff0c;来触发 Apache Log4j2 中的远程代码执行漏洞&#xff0c;从而利…

史上最牛的文科生:法学出身,却发明出十进制计算器,折磨无数人的微积分符号,跨界40多个领域惊艳学术圈

全世界只有3.14 % 的人关注了爆炸吧知识“世界上没有完全相同的两片树叶。”想必大家对这句话耳熟能详&#xff0c;但却不知道这名言背后的作者是谁吧&#xff1f;其实&#xff0c;他就是与牛顿争论微积分优先权大战中的大佬&#xff1a;莱布尼茨。博览群书 天赋异禀1646年&…

如何解决secureCRT里面的The remote system refused the connection.

不废话,先爆照 Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。然后确认sshserver是否启动了: ps -e |grep ssh 如果只有ssh-agent那ss