HDU 3605 Escape(二分图多重匹配问题)
Escape
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 10382 Accepted Submission(s): 2485
The last line has m digits, the ith digit ai indicates the ith planet can contain ai people most..
0 <= ai <= 100000
If you can output YES, otherwise output NO.
题意:
给你n个人m个星球,和第i个人能否适应第j个星球,1为适应,0为不适应。问你全部人能不能去星球上。
矩阵建边,跑一下二分图多重匹配。如果这个人无法去任意星球,直接break。
普通版:1560ms
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <queue>
- #include <map>
- #include <stack>
- #include <set>
- using namespace std;
- typedef long long LL;
- #define ms(a, b) memset(a, b, sizeof(a))
- #define pb push_back
- #define mp make_pair
- const LL INF = 0x7fffffff;
- const int inf = 0x3f3f3f3f;
- const int mod = 1e9+;
- const int maxn = +;
- const int maxm = +;
- int n, m, uN, vN;
- int g[maxn][maxm];
- int linker[maxm][maxn];
- bool used[maxm];
- int num[maxm];
- bool dfs(int u)
- {
- for(int v = ;v<vN;v++)
- if(g[u][v] && !used[v]){
- used[v] = true;
- if(linker[v][]<num[v]){
- linker[v][++linker[v][]] = u;
- return true;
- }
- for(int i = ;i<=num[];i++)
- if(dfs(linker[v][i])){
- linker[v][i] = u;
- return true;
- }
- }
- return false;
- }
- int hungary()
- {
- int res = ;
- for(int i = ;i<vN;i++){
- linker[i][] = ;
- }
- for(int u = ;u<uN;u++){
- ms(used, false);
- if(dfs(u)) res++;
- else return res;
- }
- return res;
- }
- void init() {
- ms(g, );
- }
- void solve() {
- for(int i = ;i<n;i++){
- for(int j = ;j<m;j++){
- int x;
- scanf("%d", &x);
- if(x==){
- g[i][j] = ;
- }
- else{
- g[i][j] = ;
- }
- }
- }
- for(int i = ;i<m;i++)
- scanf("%d", &num[i]);
- vN = m, uN = n;
- int ans = hungary();
- // printf("%d\n", ans);
- if(ans==n){
- printf("YES\n");
- }
- else{
- printf("NO\n");
- }
- }
- int main() {
- #ifdef LOCAL
- freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- #endif
- while(~scanf("%d%d", &n, &m)){
- init();
- solve();
- }
- return ;
- }
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <queue>
- #include <map>
- #include <stack>
- #include <set>
- using namespace std;
- typedef long long LL;
- #define ms(a, b) memset(a, b, sizeof(a))
- #define pb push_back
- #define mp make_pair
- const LL INF = 0x7fffffff;
- const int inf = 0x3f3f3f3f;
- const int mod = 1e9+;
- const int maxn = +;
- const int maxm = +;
- //输入挂
- const int MAXBUF = ;
- char buf[MAXBUF], *ps = buf, *pe = buf+;
- inline void rnext()
- {
- if(++ps == pe)
- pe = (ps = buf)+fread(buf,sizeof(char),sizeof(buf)/sizeof(char),stdin);
- }
- template <class T>
- inline bool in(T &ans)
- {
- ans = ;
- T f = ;
- if(ps == pe) return false;//EOF
- do{
- rnext();
- if('-' == *ps) f = -;
- }while(!isdigit(*ps) && ps != pe);
- if(ps == pe) return false;//EOF
- do
- {
- ans = (ans<<)+(ans<<)+*ps-;
- rnext();
- }while(isdigit(*ps) && ps != pe);
- ans *= f;
- return true;
- }
- const int MAXOUT=;
- char bufout[MAXOUT], outtmp[],*pout = bufout, *pend = bufout+MAXOUT;
- inline void write()
- {
- fwrite(bufout,sizeof(char),pout-bufout,stdout);
- pout = bufout;
- }
- inline void out_char(char c){ *(pout++) = c;if(pout == pend) write();}
- inline void out_str(char *s)
- {
- while(*s)
- {
- *(pout++) = *(s++);
- if(pout == pend) write();
- }
- }
- template <class T>
- inline void out_int(T x) {
- if(!x)
- {
- out_char('');
- return;
- }
- if(x < ) x = -x,out_char('-');
- int len = ;
- while(x)
- {
- outtmp[len++] = x%+;
- x /= ;
- }
- outtmp[len] = ;
- for(int i = , j = len-; i < j; i++,j--) swap(outtmp[i],outtmp[j]);
- out_str(outtmp);
- }
- //end
- int n, m, uN, vN;
- int g[maxn][maxm];
- int linker[maxm][maxn];
- bool used[maxm];
- int num[maxm];
- bool dfs(int u)
- {
- for(int v = ;v<vN;v++)
- if(g[u][v] && !used[v]){
- used[v] = true;
- if(linker[v][]<num[v]){
- linker[v][++linker[v][]] = u;
- return true;
- }
- for(int i = ;i<=num[];i++)
- if(dfs(linker[v][i])){
- linker[v][i] = u;
- return true;
- }
- }
- return false;
- }
- int hungary()
- {
- int res = ;
- for(int i = ;i<vN;i++){
- linker[i][] = ;
- }
- for(int u = ;u<uN;u++){
- ms(used, false);
- if(dfs(u)) res++;
- else return res;
- }
- return res;
- }
- void init() {
- ms(g, );
- }
- void solve() {
- int x;
- for(int i = ;i<n;i++){
- for(int j = ;j<m;j++){
- in(x);
- if(x==){
- g[i][j] = ;
- }
- else{
- g[i][j] = ;
- }
- }
- }
- for(int i = ;i<m;i++)
- in(num[i]);
- vN = m, uN = n;
- int ans = hungary();
- if(ans==n){
- out_str("YES");out_char('\n');
- }
- else{
- out_str("NO");out_char('\n');
- }
- }
- int main() {
- #ifdef LOCAL
- freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- #endif
- while(in(n)&&in(m)){
- init();
- solve();
- }
- write();
- return ;
- }
HDU 3605 Escape(二分图多重匹配问题)的更多相关文章
- HDU(3605),二分图多重匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others) ...
- HDU3605 Escape —— 二分图多重匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others) ...
- hdu3605 Escape 二分图多重匹配/最大流
2012 If this is the end of the world how to do? I do not know how. But now scientists have found tha ...
- hdu 3605 Escape 二分图的多重匹配(匈牙利算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others) ...
- HDU - 3605 Escape (缩点+最大流/二分图多重匹配)
题意:有N(1<=N<=1e5)个人要移民到M(1<=M<=10)个星球上,每个人有自己想去的星球,每个星球有最大承载人数.问这N个人能否移民成功. 分析:可以用最大流的思路求 ...
- hdu 3605(二分图多重匹配)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- HDU 1669 二分图多重匹配+二分
Jamie's Contact Groups Time Limit: 15000/7000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/ ...
- kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树
二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j ...
- hihoCoder 1393 网络流三·二分图多重匹配(Dinic求二分图最大多重匹配)
#1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小H ...
随机推荐
- 【python+selenium自动化】使用pytest+allure2完成自动化测试报告的输出
pytest的pytest-html插件是一个很方便的测试报告,运行自动化测试用例时,pytest后加上参数即可 allure是一个测试报告的框架,相比pytest-html的优势就是“逼格” 他的优 ...
- JS调试分享技巧
1. 学会使用console.log console.log谁都会用,但是很多同学只知道最简单的console.log(x)这样打印一个对象,当你的代码里面console.log多了之后,会很难将某条 ...
- 比Redux更容易上手的状态管理库
前言 当项目越发复杂时,我们发现仅仅是提升状态已经无法适应如此复杂的状态管理了,程序状态变得比较难同步,操作,到处是回调,发布,订阅,这意味着我们需要更好的状态管理方式,于是就引入了状态管理库,如Re ...
- hadoop编程小技巧(1)---map端聚合
測试hadoop版本号:2.4 Map端聚合的应用场景:当我们仅仅关心全部数据中的部分数据时,而且数据能够放入内存中. 使用的优点:能够大大减小网络数据的传输量,提高效率: 一般编程思路:在Mapp ...
- AI-sklearn 学习笔记(二)数据集
from sklearn import datasets from sklearn.linear_model import LinearRegression loaded_data = dataset ...
- more 分页显示文件内容
1.命令功能 more 分页显示文件内容 2.语法格式 more option file 参数说明 参数 参数说明 -num 指定屏幕显示大小为num行 +num 从行号num号开始显示 -s 把连 ...
- Redis分布式锁【实战】
概述 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency).可 ...
- java并发学习--第一章 线程的创建
所谓的并发就是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行.所以我们看似几个线程在同时进行,其实在操作系统中 ...
- 美国知名Cloudflare网络公司遭中国顶尖黑客攻击
最近中美贸易战愈演愈烈,美国知名Cloudflare网络公司的客户的分布式拒绝服务攻击今天在恶意流量方面达到了新的高度,黑客并袭击了该公司在欧洲和美国的数据中心.根据Cloudflare首席执行官马修 ...
- java基础复习(四)
---恢复内容开始--- 一.for循环的掌握 语法格式: for( 初始化语句A ; 条件判断B ; 循环后功能语句C){ //循环体D } for的执行流程: 整个for循环结构中 ...