有点烧脑。。。


这道题是求二分图完美匹配。没看请题意还不知道是求完美匹配,结果爆零。

人一共分三种:

  1. 在校学生 && 回家。这类人拥有一个床,但是不睡。

  2. 在校学生 && 不回家。这类人拥有一个床,但也要睡一个床。有时不一定睡自己的。

  3. 外来学生。这类人没床却想睡觉。

显然要用\(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]假期的宿舍相关推荐

  1. 二分图 洛谷P2055 [ZJOI2009]假期的宿舍

    [ZJOI2009]假期的宿舍 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 ...

  2. 洛谷P2055 [ZJOI2009]假期的宿舍 题解

    题目链接: https://www.luogu.org/problemnew/show/P2055 分析: 这道题比较简单,二分图的练习题(当然最大流同理). 易得我们可以将人放在一侧,床放在一侧. ...

  3. BZOJ 1433 Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法

    刚学了匈牙利正好练练手(我不会说一开始我写错了)(怕不是寒假就讲了可是我不会) 把人看做左部点,床看作右部点 建图:(!!在校相当于有床,不在校相当于没有床 但是要来学校) 1.在校的 不走的人 自己 ...

  4. P2055 [ZJOI2009]假期的宿舍(二分图匹配)

    题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题. 比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识 ...

  5. Luogu P2055 [ZJOI2009]假期的宿舍

    这个建图真玄.jpg 简直是常识题 然而我常识不足QwQ 话说题解里的代码在我看来不美观所以抄不了题解 于是debug一个小时QwQ 给萌新一点活路吧 #include<cstdio> # ...

  6. BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配

    1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2375  Solved: 1005 [Submit][S ...

  7. [ZJOI2009]假期的宿舍

    https://www.luogu.org/problemnew/show/P2055 https://www.lydsy.com/JudgeOnline/problem.php?id=1433 题解 ...

  8. BZOJ1433 [ZJOI2009]假期的宿舍 - 二分图匹配

    题解 一道裸的二分图匹配,稍微有一点细节需要注意, 但是非常裸= = 本校并且住校的向自己的床和 自己认识的并且本校的人的床连边 离校的不需要向外连边 不是本校的就和自己认识的 并且是本校的人的床连边 ...

  9. bzoj1433: [ZJOI2009]假期的宿舍

    一道匈牙利的裸题,将床和人建边,纯属复习模版了(然而就是写错了) 注意一下0和1的表示. #include<cstdio> #include<cstring> using na ...

最新文章

  1. kubeasz_使用kubeasz安装K8S集群,不受国内网络环境影响
  2. 过拟合和欠拟合以及相对应的解决办法
  3. javascript 编码规范 用更合理的方式写 javascript
  4. OTA:目标检测中的最优传输分配
  5. Linux crond实例
  6. Python Dataframe转List
  7. Linux安装配置apache
  8. Java用链表写图书管理_C语言链表实现图书管理系统
  9. CTFHUB 《请求方式》 http请求,curl命令总结
  10. ARM和X86功耗差别的深层原因探讨
  11. 【script】python3中的docx、win32com和openpyxl模块
  12. tea 加密密钥生成_加密密钥生成需要的是熵的良好来源
  13. 一起玩转LiteOS组件:Pixman
  14. linux分区合并不损坏系统,不损坏数据的情况下 linux磁盘如何扩展 LVM格式
  15. python文件生成电脑exe文件
  16. Autojs之QQ 群发消息(是QQ 群发,不是QQ群 发)
  17. 外贸常用术语_常用外贸术语
  18. Mac安装brew的四种方法(指定能行)
  19. Intellij IDEA与Eclipse对比
  20. Java基础知识(五) 字符串与数组

热门文章

  1. 李飞飞计算机视觉经典课程上线,今年都有哪些新内容?
  2. 没有iPhone SE2,苹果发布了新iPad
  3. 关闭线程池 shutdown 和 shutdownNow 的区别
  4. 别再用那些已经淘汰的技术了!2020 年 9 大顶级 Java 框架出炉!!
  5. 解决 Maven 依赖冲突的好帮手,必须了解一下!
  6. 如何设计并实现一个秒杀系统?(含完整代码)
  7. 好文推荐,15 分钟教你搞懂 Git!
  8. 超越BERT的模型有哪些?
  9. 自己挖坑自己填,谷歌大改Transformer注意力,速度、内存利用率都提上去了
  10. 深度学习“三部曲”重磅资源、python、DL理论、工程实战全覆盖(附免费下载)...