题目大意

传送门

题解

显然是二分图匹配。

用一些方法建图就好了。

要注意的是:

本题有多组数据!!!

初始化一定要注意!!!

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
const int inf = 0x3f3f3f;
int n;
// 1~n:学生
// n+1~n+k:床位
int isbed[maxn], insch[maxn];
int dist[maxn * 2], iter[maxn * 2];
struct edge {
int to, cap, rev;
};
vector<edge> G[maxn];
void add_edge(int from, int to, int cap) {
G[from].push_back((edge){to, cap, G[to].size()});
G[to].push_back((edge){from, 0, G[from].size() - 1});
}
int cnt = 0;
void read() {
scanf("%d", &n);
memset(isbed, 0, sizeof(isbed));
for (int i = 0; i <= 2 * n + 1; i++) {
G[i].clear();
}
cnt = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &isbed[i]);
}
for (int i = 1; i <= n; i++) {
scanf("%d", &insch[i]);
insch[i] = insch[i] ^ 1;
}
for (int i = 1; i <= n; i++) {
if (isbed[i])
add_edge(i, i + n, 1);
for (int j = 1; j <= n; j++) {
int x;
scanf("%d", &x);
if (x && isbed[j]) {
if (!(isbed[i]) || (isbed[i] && insch[i])) {
add_edge(i, n + j, 1);
}
}
}
if (!(isbed[i]) || (isbed[i] && insch[i])) {
cnt++;
add_edge(0, i, 1);
} if (isbed[i])
add_edge(n + i, 2 * n + 1, 1);
}
}
void bfs(int from) {
memset(dist, -1, sizeof(dist));
dist[from] = 0;
queue<int> q;
q.push(from);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < G[u].size(); i++) {
edge &e = G[u][i];
if (dist[e.to] < 0 && e.cap > 0) {
dist[e.to] = dist[u] + 1;
q.push(e.to);
}
}
}
}
int dfs(int from, int to, int f) {
if (from == to)
return f;
for (int &i = iter[from]; i < G[from].size(); i++) {
edge &e = G[from][i];
if (e.cap > 0 && dist[e.to] > dist[from]) {
int d = dfs(e.to, to, min(f, e.cap));
if (d > 0) {
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
}
return 0;
}
int max_flow(int from, int to) {
int flow = 0;
for (;;) {
bfs(from);
if (dist[to] < 0)
return flow;
memset(iter, 0, sizeof(iter));
int f;
while ((f = dfs(from, to, inf) > 0))
flow += f;
}
}
int main() {
// freopen("input", "r", stdin);
int T;
scanf("%d", &T);
while (T--) {
cnt = 0;
read();
int ans = max_flow(0, 2 * n + 1);
if (ans == cnt)
printf("^_^\n");
else
printf("T_T\n");
}
return 0;
}

[bzoj1433][ZJOI2009]假期的宿舍——二分图的更多相关文章

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

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

  2. BZOJ1433 [ZJOI2009]假期的宿舍 二分图匹配 匈牙利算法

    原文链接http://www.cnblogs.com/zhouzhendong/p/8372785.html 题目传送门 - BZOJ1433 题解 我们理一理题目. 在校的学生,有自己的床,还可以睡 ...

  3. BZOJ1433[ZJOI2009]假期的宿舍——二分图最大匹配

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

  4. bzoj1433: [ZJOI2009]假期的宿舍 [二分图][二分图最大匹配]

    Description Input Output Sample Input 1 3 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 Sample Output ˆ ˆ HINT 对于30% ...

  5. [ZJOI2009]假期的宿舍 二分图匹配匈牙利

    [ZJOI2009]假期的宿舍 二分图匹配匈牙利 一个人对应一张床,每个人对床可能不止一种选择,可以猜出是二分图匹配. 床只能由本校的学生提供,而需要床的有住校并且本校和外校两种人.最后统计二分图匹配 ...

  6. bzoj1433: [ZJOI2009]假期的宿舍(最大二分图匹配)

    1433: [ZJOI2009]假期的宿舍 题目:传送门 题解: 这题有点水 跑个二分图匹配就完事了(注意在校生不是一定都互相认识) 代码: #include<cstdio> #inclu ...

  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: 2544  Solved: 1074 [Submit][St ...

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

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

随机推荐

  1. Java 的单元测试

    有点需要注意,当 JUnit 主线程退出,子线程也会跟着退出,需要使用子线程的 join() 方法使主线程等待 Maven 依赖 <dependency> <groupId>j ...

  2. is 和 == 的区别,utf和gbk的转换,join用法

    is 和 == 的区别 # is 比较的是内存地址 # == 比较的是值 a = 'alex' b = 'alex' #int,str(小数据池)会被缓存,为了节约内存 print(id(a),id( ...

  3. [bzoj1999][noip2007]Core树网的核

    好久没写题解了.这题不算太水就写一下题解. 话说回来,虽然不水但是挺裸.可以说题意即一半题解了. 我猜粘了题面也没有人去看的,所以直接人话题意了. 给一棵树,点数1e6,(当年noip的n当然是只有3 ...

  4. Android log 引发的血案

    今天调试代码,我打印了一个东西: Log.d("WelcomeActivity", res.str); 结果总是代码执行不到这一行的下一行,程序也没有挂掉.后来,我自己去想各种可能 ...

  5. shell编程——

    一.分支语句 语法:(多路分支) case word in patterm1) list A ;; pattern2) list B ;; patternN) list N ;; esac例子:cas ...

  6. 《Cracking the Coding Interview》——第8章:面向对象设计——题目6

    2014-04-23 22:57 题目:实现一个数据结构来表示拼图游戏中的碎片. 解法:一个拼图块儿有四条边,每边只有凹凸平三种情况,当两块碎片拼接的时候,分为四个方向进行,块儿上的图案肯定也是判断是 ...

  7. Python lambda介绍

    在学习python的过程中,lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda? 下面就上面的问题进行一下解答. 1.lambda是什么? ...

  8. Springboot 启动问题

    每次以debug方式启动springboot之后都会在SilentExitExceptionHandler类中的throw new SilentExitException() 解决办法 :window ...

  9. 一个初学者的辛酸路程-jQuery

    前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang=" ...

  10. (转\整)UE4游戏优化 多人大地型游戏的优化(一)游戏线程的优化

    施主分享随缘,评论随心,@author:白袍小道 小道暗语: 1.因为小道这里博客目录没自己整,暂时就用随笔目录结构,所以二级目录那啥就忽略了.标题格式大致都是(原or转) 二级目录 (标题) 2.因 ...