[bzoj1433][ZJOI2009]假期的宿舍——二分图
题目大意
题解
显然是二分图匹配。
用一些方法建图就好了。
要注意的是:
本题有多组数据!!!
初始化一定要注意!!!
代码
#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]假期的宿舍——二分图的更多相关文章
- BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2375 Solved: 1005[Submit][Sta ...
- BZOJ1433 [ZJOI2009]假期的宿舍 二分图匹配 匈牙利算法
原文链接http://www.cnblogs.com/zhouzhendong/p/8372785.html 题目传送门 - BZOJ1433 题解 我们理一理题目. 在校的学生,有自己的床,还可以睡 ...
- BZOJ1433[ZJOI2009]假期的宿舍——二分图最大匹配
题目描述 学校放假了······有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如A 和B都是学校的学生,A要回家,而C来看B,C与A不认识.我们假设每个人只能睡和自己直接认 ...
- 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% ...
- [ZJOI2009]假期的宿舍 二分图匹配匈牙利
[ZJOI2009]假期的宿舍 二分图匹配匈牙利 一个人对应一张床,每个人对床可能不止一种选择,可以猜出是二分图匹配. 床只能由本校的学生提供,而需要床的有住校并且本校和外校两种人.最后统计二分图匹配 ...
- bzoj1433: [ZJOI2009]假期的宿舍(最大二分图匹配)
1433: [ZJOI2009]假期的宿舍 题目:传送门 题解: 这题有点水 跑个二分图匹配就完事了(注意在校生不是一定都互相认识) 代码: #include<cstdio> #inclu ...
- bzoj1433: [ZJOI2009]假期的宿舍
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2286 Solved: 969[Submit][Stat ...
- bzoj1433[ZJOI2009]假期的宿舍(匈牙利)
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2544 Solved: 1074 [Submit][St ...
- bzoj1433 [ZJOI2009]假期的宿舍(最大流)
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1717 Solved: 754[Submit][Stat ...
随机推荐
- 如何删除hive表格的分区
今天的一个业务场景就是要把三年的数据从第一天不停的融合起来,每一天作为表格一个新的分区.由于空间有限,数据量很大,可能每天数据都是几十个G的大小.所以我需要做的一点就是在融合这一天之后,删除一天的分区 ...
- 学习python第十四天,模块
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代码 ...
- Python logging 模块简介
Table of Contents 1. Logging 模块 1.1. 简介 1.2. 简单输出日志 1.3. 输入日志到文件 1.4. 几个基本概念 1.4.1. loggers 1.4.2. h ...
- Diycode开源项目 如何解决InputMethodManager造成的内存泄漏问题
1.内存泄漏的状况及原因 1.1.利用LeakCanary查看内存泄漏的状况 1.2.内存泄漏怎么产生的呢? InputMethodManager.mServicedView持有一个最后聚焦View的 ...
- android的5个进程等级
一.Foreground Process(前台进程,优先级别最高) 1.正处于 Activity Resume() 状态 2.正处于与 bound 服务交互的状态 3.正处于服务在前台运行的状态(st ...
- [译]13-spring 内部bean
spring基于xml配置元数据的方式下,位于property元素或者contructor-arg元素内的bean元素被称为内部bean,如下: <?xml version="1.0& ...
- java实现最大堆
优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (first in, ...
- HDU 4436 str2int (后缀自动机)
把所有的字符串连接起来,中间用一个未出现的字符分隔开,题意是求这个串的所有子串(中间不含分隔符)形成的数之和. 把这个串加入SAM,对所有子串进行拓扑排序,从前往后统计. 记录到达这个节点的路径个数c ...
- 团队项目-第九次scrum 会议
时间:11.5 时长:40分钟 地点:F楼1039教室 工作情况 团队成员 已完成任务 待完成任务 解小锐 完成员工commit函数的数值函数编写 完成多种招聘方式的逻辑编写 陈鑫 实现游戏的暂停功能 ...
- Application_Start事件中用Timer做一个循环任务
protected void Application_Start(object sender, EventArgs e) { System.Timers.Timer timer = new Syste ...