题目链接

题目大意

输入数据中,第一行给出n,表示n个奶牛。

接下来n行,每行一个x,xi表示第i头奶牛可以选择x个谷仓中的一个进行匹配。接下来x个数,表示谷仓的编号(1~n之间)

一个谷仓也只能有一头奶牛,问最多可以有多少组匹配。

这道题作为二分图匹配模版是再好不过了。

先讲一讲什么是二分图:一个图中,如果能够把所有的点分成两堆,使得任何一条边的两个顶点分属两堆,则是二分图。

具体长成这个样子:

那么如果我们选一定数量的边,使得这些边两两之间没有公共顶点,求最大的边数。

这种题我们使用匈牙利算法求解,可以看我的博客:匈牙利算法-二分图匹配(还没写)

所以这道题的代码就呼之欲出了:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 int n,m;
 5 int first[205];
 6 int len=0;
 7 bool map[205][205];
 8 int match[205];
 9 bool chw[205];
10 bool find_mn(int x)
11 {
12     for(int i=1;i<=m;i++)
13     {
14         if(map[x][i]==true && chw[i]==true)
15         {
16             chw[i]=false;
17             if(match[i]==0 || find_mn(match[i])==true)
18             {
19                 match[i]=x;
20                 return true;
21             }
22         }
23     }
24     return false;
25 }
26 int main()
27 {
28     while(scanf("%d %d",&n,&m)!=EOF)
29     {
30     memset(first,0,sizeof(first));
31     memset(map,false,sizeof(map));
32     len=0;
33     for(int i=1;i<=n;i++)
34     {
35         int x;
36         scanf("%d",&x);
37         for(int j=1;j<=x;j++)
38         {
39             int soy;
40             scanf("%d",&soy);
41             map[i][soy]=true;
42         }
43     }
44     int ans=0;
45     memset(match,0,sizeof(match));
46     for(int i=1;i<=n;i++)
47     {
48         memset(chw,true,sizeof(chw));
49         if(find_mn(i)==true)ans++;
50     }
51     printf("%d\n",ans);
52 }
53     return 0;
54 }

View Code

转载于:https://www.cnblogs.com/AFOer-lhy/p/7831970.html

【Step1】【二分图匹配】poj 1274-The Perfect Stall相关推荐

  1. poj 1274 The Perfect Stall

    2019独角兽企业重金招聘Python工程师标准>>> The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total ...

  2. POJ 2724 Purifying Machine (二分图匹配)

    题意 给定m个长度为n的01串(*既表示0 or 1.如*01表示001和101).现在要把这些串都删除掉,删除的方法是:①一次删除任意指定的一个:②如果有两个串仅有一个字符不同,则可以同时删除这两个 ...

  3. Rain on your Parade(二分图匹配-Hopcroft-Carp算法)

    (代码里有很多注释) 匈牙利算法的复杂度是O(n*e),那么如果对于一个点和边比较多的图,匈牙利算法很容易超时,采用Hopcroft-Carp算法能够在 O(sqrt(n)*e)的复杂度内实现二分图匹 ...

  4. 二分图匹配 Hopcroft-Carp (HK) 算法详解 附例题

    了解这个算法之前 首先了解一个概念 :增广路 增广路 :简单的说 ,是二分图匹配中的一条边,他总是从 左边集合的一个点出发通过一条没有被匹配的边连接到右边集合,再从该点通过一条 匹配过的边连接到右边集 ...

  5. KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home

    最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大.解决这个问题可以用KM算法.理解KM算法需要首先理解"可行顶标"的概念.可行顶标是指关于二分图 ...

  6. 匈牙利算法解决二分图匹配问题

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出.匈牙利算法是基于Hall定理中充分性证明的思想,它是二分图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的 ...

  7. Dinic二分图匹配 || Luogu P3386

    题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...

  8. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

  9. poj1274(二分图匹配)

    (一道基础的二分图匹配) 题目意思大概为N个牛和M个栅栏,一个牛和一个栅栏只能匹配一次,求最大匹配 直接套用二分图最大匹配模板即可 #include <iostream> #include ...

最新文章

  1. [Java基础]Scanner的使用(秋招在线笔试高频使用)版本:Java™ Platform Standard Ed. 8...
  2. 刷爆全网的动态条形图,原来 5 行 Python 代码就能实现!
  3. python之matloplib可视化
  4. 1074. 元素和为目标值的子矩阵数量
  5. matlab利用图像减法实现找茬
  6. ggplot2:可视化设计师的神器,了解一下
  7. linux meta 18.0.1 系统安装nodejs
  8. Android 批量修改文件格式/文件名的骚操作
  9. 图表数据分析怎么做,举实例给你说清楚
  10. android如何截屏快捷键,安卓手机怎么截图 各大品牌快捷键截屏大集合
  11. 细思恐极的星座分析(上) ——用大数据和机器学习揭开十二星座的真实面目!
  12. 动态内存分配实现冒泡排序
  13. prometheus 监控交换机流量
  14. Gcc编译过程和C语言内存管理
  15. java实习经验与总结建议
  16. 72 ----直纹面、二次直纹面、单叶双曲面、双曲抛物面
  17. git删除远端分支命令
  18. DataFrame写入mysql时报错Duplicate entry ‘...‘ for key ‘PRIMARY
  19. 梦里花落知多少,真性情是三毛
  20. 个人电脑硬件介绍(2021-09-07)

热门文章

  1. android 炫酷3d主页,五款超酷安卓手机3D桌面软件合辑推荐
  2. linux samba 多个目录,linux7 Samba服务配置,多个部门相应管理自己的项目目录,其他有访问权限...
  3. 如何将像素坐标转化为机械臂基座坐标_机械臂抓取自动精准标定
  4. SQLi LABS Less-8 布尔盲注
  5. SQLi LABS Less 27a 联合注入+布尔盲注+时间盲注
  6. ajax control toolkit vs2013,VS2008 .net framework 3.5使用Ajax Control Toolkit完整解决方案
  7. Python基础教程:Day14b-网络应用开发
  8. 算法概论第八章课后习题8.3
  9. Unity5 新功能解析--物理渲染与standard shader
  10. 1092 最好吃的月饼 (20分)