[BZOJ1433][luogu_P2055][ZJOI2009]假期的宿舍

试题描述

输入

输出

输入示例

  1. 1
  2. 3
  3. 1 1 0
  4. 0 1 0
  5. 0 1 1
  6. 1 0 0
  7. 1 0 0

输出示例

  1. ^_^

数据规模及约定

对于 \(30\texttt{%}\) 的数据满足 \(1 \le n \le 12\)。

对于 \(100\texttt{%}\) 的数据满足 \(1 \le n \le 50,1 \le T \le 20\)。

题解

每个人和每个人的床分别建一个节点,源点向不回家的和不是学生的人连边,是学生的床向汇点连边,每个人向他认识人的床连边,以上所有边容量都为 \(1\),跑最大流看是否满。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cctype>
  6. #include <algorithm>
  7. using namespace std;
  8. #define rep(i, s, t) for(int i = (s); i <= (t); i++)
  9. #define dwn(i, s, t) for(int i = (s); i >= (t); i--)
  10. int read() {
  11. int x = 0, f = 1; char c = getchar();
  12. while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
  13. while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
  14. return x * f;
  15. }
  16. #define maxn 110
  17. #define maxm 5210
  18. #define oo 2147483647
  19. struct Edge {
  20. int from, to, flow;
  21. Edge() {}
  22. Edge(int _1, int _2, int _3): from(_1), to(_2), flow(_3) {}
  23. };
  24. struct Dinic {
  25. int n, m, s, t, head[maxn], nxt[maxm];
  26. Edge es[maxm];
  27. int vis[maxn], Q[maxn], hd, tl;
  28. int cur[maxn];
  29. void init() {
  30. m = 0; memset(head, -1, sizeof(head));
  31. return ;
  32. }
  33. void setn(int _) {
  34. n = _;
  35. return ;
  36. }
  37. void AddEdge(int a, int b, int c) {
  38. es[m] = Edge(a, b, c); nxt[m] = head[a]; head[a] = m++;
  39. es[m] = Edge(b, a, 0); nxt[m] = head[b]; head[b] = m++;
  40. return ;
  41. }
  42. bool BFS() {
  43. memset(vis, 0, sizeof(vis));
  44. vis[t] = 1;
  45. hd = tl = 0; Q[++tl] = t;
  46. while(hd < tl) {
  47. int u = Q[++hd];
  48. for(int i = head[u]; i != -1; i = nxt[i]) {
  49. Edge& e = es[i^1];
  50. if(!vis[e.from] && e.flow) {
  51. vis[e.from] = vis[u] + 1;
  52. Q[++tl] = e.from;
  53. }
  54. }
  55. }
  56. return vis[s] > 0;
  57. }
  58. int DFS(int u, int a) {
  59. if(u == t || !a) return a;
  60. int flow = 0, f;
  61. for(int& i = cur[u]; i != -1; i = nxt[i]) {
  62. Edge& e = es[i];
  63. if(vis[e.to] == vis[u] - 1 && (f = DFS(e.to, min(a, e.flow)))) {
  64. flow += f; a -= f;
  65. e.flow -= f; es[i^1].flow += f;
  66. if(!a) return flow;
  67. }
  68. }
  69. return flow;
  70. }
  71. int MaxFlow(int _s, int _t) {
  72. s = _s; t = _t;
  73. int flow = 0;
  74. while(BFS()) {
  75. rep(i, 1, n) cur[i] = head[i];
  76. flow += DFS(s, oo);
  77. }
  78. return flow;
  79. }
  80. } sol;
  81. bool stu[maxn];
  82. int main() {
  83. int T = read();
  84. while(T--) {
  85. int n = read(), S = (n << 1) + 1, T = S + 1;
  86. sol.init(); sol.setn((n << 1) + 2);
  87. int cnt = 0;
  88. rep(i, 1, n){ stu[i] = read(); if(stu[i]) sol.AddEdge(i + n, T, 1); }
  89. rep(i, 1, n) if(!read() || !stu[i]) sol.AddEdge(S, i, 1), cnt++;
  90. rep(i, 1, n) rep(j, 1, n) if(read() || i == j) sol.AddEdge(i, j + n, 1);
  91. puts(sol.MaxFlow(S, T) == cnt ? "^_^" : "T_T");
  92. }
  93. return 0;
  94. }

[BZOJ1433][luogu_P2055][ZJOI2009]假期的宿舍的更多相关文章

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

    明显的二分图最大匹配. #include<cstdio> #include<cstring> #include<cctype> #include<algori ...

  2. 【bzoj1433】 ZJOI2009—假期的宿舍

    http://www.lydsy.com/JudgeOnline/problem.php?id=1433 (题目链接) 题意 一个暑假,有人去大学里面探望朋友,有些人回家了,有些人留下了,每个人都要在 ...

  3. 「BZOJ1433」[ZJOI2009] 假期的宿舍(二分图,网络流)

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

  4. 【BZOJ1433】[ZJOI2009] 假期的宿舍(二分图匹配入门)

    点此看题面 大致题意:有\(n\)个学生,其中一部分是在校学生,一部分不是,而在校学生中一部分回家,一部分不回家,并且我们用一个01矩阵表示学生之间相互认识关系.已知每个学生只能睡自己认识的人的床(当 ...

  5. 【bzoj1433】[ZJOI2009]假期的宿舍

    按要求连边,跑匈牙利 #include<algorithm> #include<iostream> #include<cstdlib> #include<cs ...

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

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

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

    1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2286  Solved: 969[Submit][Stat ...

  8. bzoj1433 [ZJOI2009]假期的宿舍(最大流)

    1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1717  Solved: 754[Submit][Stat ...

  9. bzoj1433 [ZJOI2009]假期的宿舍 最大流

    [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3429  Solved: 1459[Submit][Status][D ...

随机推荐

  1. 2018.10.26 NOIP2018模拟赛 解题报告

    得分: \(0+10+10=20\)(\(T1\)死于假题面,\(T3\)死于细节... ...) \(P.S.\)由于原题是图片,所以我没有上传题目描述,只有数据. \(T1\):颜料大乱斗(点此看 ...

  2. python_27_多级字典嵌套及操作

    #key-value 字典无下标 所以乱序,key值尽量不要取中文 person_log={ '大二':{ 'Ya Nan':['free','cute','soso'], 'Sha sha':['微 ...

  3. SHOI2001 小狗散步

    题目传送门 感觉这题最大的难点是发现它的解法是二分图最大匹配 主人的路线是固定的,对于每一段的路线,我们可以枚举小狗想去的景点,如果时间够,我们就将这段路线的起点和小狗想去的点连起来 这样就形成了一个 ...

  4. 在DOS界面下快速进入目录的技巧

    在DOS界面如果想进入某一目录还是比较困难的,尤其是有长目录名和中文目录名的时候. 比如:要进入“D:/工具箱/杀毒软件”这个目录. 1.在Windows下进入这个目录. 2.在地址栏输入 C:/WI ...

  5. 后台调用前台js

    WEB后台代码调用前台JS(两种方式). 1   这种方式只能调用简单的JS代码.不能调用自定义的函数. string jss = "<script language='javascr ...

  6. ARC机制中的Strong和weak

    什么是ARC Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化.ARC是新的LLVM 3.0编译 ...

  7. LOJ#6342. 跳一跳(期望)

    题意 $n \leqslant 10^5$ Sol 随便推一推就好了吧.. $f[i] = \frac{f[i] + f[i +1] + \dots f[n]}{n - i + 1} + 1$ 移一下 ...

  8. Oracle - 存储过程、函数、包的使用练习-雇员

    --存储过程范例:得到雇员表 emp 的记录数 begin --说明:若过程中要向外抛异常,请使用 exception when others then raise; 这个抛出的异常在程序里是可以捕获 ...

  9. git线上线下冲突

    今天用git pull来更新代码,遇到了下面的问题: error: Your local changes to the following files would be overwritten by ...

  10. Nginx认证

    Nginx 的 ngx_http_auth_basic_module模块允许通过使用“HTTP基本认证”协议验证用户名和密码来限制对资源的访问. 配置举例: location / { auth_bas ...