博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1274 The Perfect Stall【二部图最大匹配】
阅读量:6593 次
发布时间:2019-06-24

本文共 1524 字,大约阅读时间需要 5 分钟。

主题链接:

题目大意:

有N头奶牛(编号1~N)和M个牛棚(编号1~M)。

每头牛仅仅可产一次奶。每一个牛棚也仅仅同意一仅仅牛产奶。

如今给出每头奶牛喜欢去的牛棚的编号。问:最多有多少头奶牛能完毕产奶。

思路:

二分图最大匹配问题,建立一个图,用行来表示奶牛,用列来表示牛棚。将奶牛和喜欢去的牛棚编号

连边。

然后用匈牙利算法DFS版或BFS版求二分图的最大匹配数就可以。这里用了匈牙利算法DFS版。

AC代码:

#include
#include
#include
#include
using namespace std;const int MAXN = 220;bool Map[MAXN][MAXN];bool bMask[MAXN];int NX,NY;int cx[MAXN],cy[MAXN];int FindPath(int u){ for(int i = 1; i <= NY; ++i) { if(Map[u][i] && !bMask[i]) { bMask[i] = 1; if(cy[i] == -1 || FindPath(cy[i])) { cy[i] = u; cx[u] = i; return 1; } } } return 0;}int MaxMatch(){ int res = 0; for(int i = 1; i <= NX; ++i) cx[i] = -1; for(int i = 1; i <= NY; ++i) cy[i] = -1; for(int i = 1; i <= NX; ++i) { if(cx[i] == -1) { for(int j = 1; j <= NY; ++j) bMask[j] = 0; res += FindPath(i); } } return res;}int main(){ int d,id; while(~scanf("%d%d",&NX,&NY)) { memset(Map,0,sizeof(Map)); for(int i = 1; i <= NX; ++i) { scanf("%d",&id); for(int j = 1; j <= id; ++j) { scanf("%d",&d); Map[i][d] = 1; } } printf("%d\n",MaxMatch()); } return 0;}


版权声明:本文博主原创文章,博客,未经同意不得转载。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4913353.html,如需转载请自行联系原作者

你可能感兴趣的文章
3分鐘了解 301 與 302 Redirect 重定向之間的差異與它們如何影響網站 SEO 排名 - Whopos SEO...
查看>>
使用rollup打包库的一种基本配置
查看>>
Spring Boot 学习笔记(4):配置properties(2)
查看>>
解决IQKeyboard键盘引起的视图上移
查看>>
VUE的生命周期
查看>>
'@/'路径和'./'路径是什么意思
查看>>
SpringBoot | 第零章:前言
查看>>
ES 学习笔记-安装
查看>>
微信支付-H5支付绕过ip地址
查看>>
SpringCloud微服务实战
查看>>
Vue、Typescript 的项目实践
查看>>
Jenkins搭建
查看>>
JavaScript在浏览器环境下的事件循环(Event Loop)
查看>>
JS 事件
查看>>
如何优雅的设计RESTful API?这是我看过讲的最清晰的文章!
查看>>
前端技术 | react-router,去中心化式路由
查看>>
iOS加密解密算法
查看>>
如何对接PaaS平台外部的Maven仓库以及如何使用平台自带Maven仓库
查看>>
JavaScript 算法
查看>>
Redis +Codis 百万并发同城多机房使用与经验
查看>>