P2055 [ZJOI2009]假期的宿舍
有点烧脑。。。
这道题是求二分图完美匹配。没看请题意还不知道是求完美匹配,结果爆零。
人一共分三种:
在校学生 && 回家。这类人拥有一个床,但是不睡。
在校学生 && 不回家。这类人拥有一个床,但也要睡一个床。有时不一定睡自己的。
外来学生。这类人没床却想睡觉。
显然要用\(2n\)的空间来建立人和床。
等待匹配的人只有1、3两种情况,等待匹配的床只有1、2两种情况。
第1种情况连床没什么卵用。又不睡。
只有第2种情况的人可以连自己的床。
第3种情况的人一定要睡别人的床。
在2、3种情况中,只要认识的人有床,就可以连接。
然后套个二分图匹配的样子,跑跑网络流就ok了。
最后判断答案是不是等于人数,输出那两个表情即可。
代码:
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
const int maxn = 1005, INF = 19260817;
struct Edges
{int next, to, weight;
} e[1000005];
int head[maxn], tot;// remember to set tot = 1
int n, s, t;
bool in_school[maxn], go_home[maxn];
int dep[maxn], cur[maxn];
void link(int u, int v, int w)
{e[++tot] = (Edges){head[u], v, w};head[u] = tot;
}
void addEdges(int u, int v, int w)
{link(u, v, w); link(v, u, 0);
}
int read()
{int ans = 0; char ch = getchar();while(ch > '9' || ch < '0') ch = getchar();while(ch >= '0' && ch <= '9'){ans = ans * 10 + ch - '0';ch = getchar();}return ans;
}
bool bfs()
{memset(dep, 0, sizeof(dep));std::queue<int> q;dep[s] = 1; q.push(s);while(!q.empty()){int u = q.front(); q.pop();for(int i = head[u]; i; i = e[i].next){int v = e[i].to;if(!dep[v] && e[i].weight > 0){dep[v] = dep[u] + 1;q.push(v);}}}return dep[t];
}
int dfs(int u, int flow)
{if(u == t) return flow;for(int &i = cur[u]; i; i = e[i].next){int v = e[i].to;if(dep[v] == dep[u] + 1 && e[i].weight > 0){int di = dfs(v, std::min(e[i].weight, flow));if(di > 0){e[i].weight -= di;e[i ^ 1].weight += di;return di;}}}return 0;
}
int dinic()
{int ans = 0;while(bfs()){for(int i = 1; i <= t; i++) cur[i] = head[i];while(int temp = dfs(s, INF)) ans += temp;}return ans;
}
int main()
{int T = read();while(T--){// how to define nodes?// [1, n] person// [n + 1, n + n] beds// not go home->need bed// only do in-school students have beds// not in-school students->the persons visiting// go home->never consider themtot = 1; memset(head, 0, sizeof(head)); memset(e, 0, sizeof(e));n = read();int cnt = 0;s = n + n + 1; t = s + 1;for(int i = 1; i <= n; i++) in_school[i] = read();for(int i = 1; i <= n; i++) go_home[i] = read();for(int i = 1; i <= n; i++){addEdges(s, i, 1);addEdges(n + i, t, 1);if((in_school[i] && !go_home[i]) || !in_school[i]) cnt++;}for(int i = 1; i <= n; i++){if(in_school[i] && !go_home[i]) addEdges(i, n + i, 1);for(int j = 1; j <= n; j++){int temp = read();if(temp && in_school[j] && !(in_school[i] && go_home[i])) addEdges(i, n + j, 1);}}int ans = dinic();if(ans == cnt) printf("^_^\n");else printf("T_T\n");}return 0;
}
转载于:https://www.cnblogs.com/Garen-Wang/p/9352193.html
P2055 [ZJOI2009]假期的宿舍相关推荐
- 二分图 洛谷P2055 [ZJOI2009]假期的宿舍
[ZJOI2009]假期的宿舍 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 ...
- 洛谷P2055 [ZJOI2009]假期的宿舍 题解
题目链接: https://www.luogu.org/problemnew/show/P2055 分析: 这道题比较简单,二分图的练习题(当然最大流同理). 易得我们可以将人放在一侧,床放在一侧. ...
- BZOJ 1433 Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法
刚学了匈牙利正好练练手(我不会说一开始我写错了)(怕不是寒假就讲了可是我不会) 把人看做左部点,床看作右部点 建图:(!!在校相当于有床,不在校相当于没有床 但是要来学校) 1.在校的 不走的人 自己 ...
- P2055 [ZJOI2009]假期的宿舍(二分图匹配)
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题. 比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识 ...
- Luogu P2055 [ZJOI2009]假期的宿舍
这个建图真玄.jpg 简直是常识题 然而我常识不足QwQ 话说题解里的代码在我看来不美观所以抄不了题解 于是debug一个小时QwQ 给萌新一点活路吧 #include<cstdio> # ...
- BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2375 Solved: 1005 [Submit][S ...
- [ZJOI2009]假期的宿舍
https://www.luogu.org/problemnew/show/P2055 https://www.lydsy.com/JudgeOnline/problem.php?id=1433 题解 ...
- BZOJ1433 [ZJOI2009]假期的宿舍 - 二分图匹配
题解 一道裸的二分图匹配,稍微有一点细节需要注意, 但是非常裸= = 本校并且住校的向自己的床和 自己认识的并且本校的人的床连边 离校的不需要向外连边 不是本校的就和自己认识的 并且是本校的人的床连边 ...
- bzoj1433: [ZJOI2009]假期的宿舍
一道匈牙利的裸题,将床和人建边,纯属复习模版了(然而就是写错了) 注意一下0和1的表示. #include<cstdio> #include<cstring> using na ...
最新文章
- kubeasz_使用kubeasz安装K8S集群,不受国内网络环境影响
- 过拟合和欠拟合以及相对应的解决办法
- javascript 编码规范 用更合理的方式写 javascript
- OTA:目标检测中的最优传输分配
- Linux crond实例
- Python Dataframe转List
- Linux安装配置apache
- Java用链表写图书管理_C语言链表实现图书管理系统
- CTFHUB 《请求方式》 http请求,curl命令总结
- ARM和X86功耗差别的深层原因探讨
- 【script】python3中的docx、win32com和openpyxl模块
- tea 加密密钥生成_加密密钥生成需要的是熵的良好来源
- 一起玩转LiteOS组件:Pixman
- linux分区合并不损坏系统,不损坏数据的情况下 linux磁盘如何扩展 LVM格式
- python文件生成电脑exe文件
- Autojs之QQ 群发消息(是QQ 群发,不是QQ群 发)
- 外贸常用术语_常用外贸术语
- Mac安装brew的四种方法(指定能行)
- Intellij IDEA与Eclipse对比
- Java基础知识(五) 字符串与数组
热门文章
- 李飞飞计算机视觉经典课程上线,今年都有哪些新内容?
- 没有iPhone SE2,苹果发布了新iPad
- 关闭线程池 shutdown 和 shutdownNow 的区别
- 别再用那些已经淘汰的技术了!2020 年 9 大顶级 Java 框架出炉!!
- 解决 Maven 依赖冲突的好帮手,必须了解一下!
- 如何设计并实现一个秒杀系统?(含完整代码)
- 好文推荐,15 分钟教你搞懂 Git!
- 超越BERT的模型有哪些?
- 自己挖坑自己填,谷歌大改Transformer注意力,速度、内存利用率都提上去了
- 深度学习“三部曲”重磅资源、python、DL理论、工程实战全覆盖(附免费下载)...