bzoj1433
1433: [ZJOI2009]假期的宿舍
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3371 Solved: 1425
[Submit][Status][Discuss]
Description

Input

Output

Sample Input
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0
Sample Output
HINT
对于30% 的数据满足1 ≤ n ≤ 12。
对于100% 的数据满足1 ≤ n ≤ 50,1 ≤ T ≤ 20。
我的方法跟网上其他博客有点不一样,随便YY的。把每个人拆成2个点ai bi,建立超级源汇S,T。
(1)S向所有 外校人员的ai建立容量1的边
(2)所有 在校的要回家的学生的bi向T连容量为1的边
(3)对于一对相互认识的人bi->aj互相建容量无穷边
(4)每个人的ai向bi建立容量1的边
这样以后一个流就表示一个挪动方案
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#define inf 0x3f3f3f3f
#define ll long long
#define N 105
using namespace std;
int n,S,T,tot,cur[N],st[N],hd[N],gh[N],kn[N][N],d[N],vis[N];
struct edge{int v,next,cap,flow;}e[N*N*4];
void adde(int u,int v,int c){
e[tot].v=v;
e[tot].next=hd[u];
e[tot].cap=c;
e[tot].flow=0;
hd[u]=tot++;
} bool bfs(){
queue<int>q;
memset(vis,0,sizeof(vis));
q.push(S);d[S]=0;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=1;
for(int i=hd[u];~i;i=e[i].next){
int v=e[i].v;
if(e[i].cap<=e[i].flow||vis[v])continue;
d[v]=d[u]+1;q.push(v);
}
}
return vis[T];
} int dfs(int u,int a){
if(u==T||!a)return a;
int fl=0,f;
for(int i=hd[u];~i;i=e[i].next){
int v=e[i].v;
if(d[v]==d[u]+1&&(f=dfs(v,min(e[i].cap-e[i].flow,a)))){
fl+=f;a-=f;
e[i].flow+=f;
e[i^1].flow-=f;
if(a<=0)break;
}
}
return fl;
}
int main(){
#ifdef wsy
freopen("data.in","r",stdin);
#else
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
#endif
int cas;scanf("%d",&cas);
while(cas--){
scanf("%d",&n);S=0;T=2*n+1;tot=0;
memset(hd,-1,sizeof(hd));
for(int i=1;i<=n;i++)scanf("%d",&st[i]); // for(int i=1;i<=n;i++)if(!st[i])printf("%d ",i);puts(""); for(int i=1;i<=n;i++)scanf("%d",&gh[i]); // for(int i=1;i<=n;i++)if(st[i]&&gh[i])printf("%d ",i);puts(""); for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&kn[i][j]);
for(int i=1;i<=n;i++){
if(st[i]){
if(gh[i])adde(i+n,T,1),adde(T,i+n,0);
}
else adde(S,i,1),adde(i,S,0);
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++){
if(!kn[i][j])continue;
// printf("%d %d\n",i,j);
int f1=st[i],f2=st[j];
if(f1)adde(j+n,i,inf),adde(i,j+n,0);
if(f2)adde(i+n,j,inf),adde(j,i+n,0);
}
for(int i=1;i<=n;i++)
adde(i,i+n,1),adde(i+n,i,0);
while(bfs()){
for(int i=S;i<=T;i++)cur[i]=hd[i];
dfs(S,0x3f3f3f3f);
}
int fg=0;
for(int i=hd[S];~i;i=e[i].next)
if(e[i].cap-e[i].flow>0)fg=1;
if(fg)puts("T_T");
else puts("^_^");
}
return 0;
}
bzoj1433的更多相关文章
- 【bzoj1433】 ZJOI2009—假期的宿舍
http://www.lydsy.com/JudgeOnline/problem.php?id=1433 (题目链接) 题意 一个暑假,有人去大学里面探望朋友,有些人回家了,有些人留下了,每个人都要在 ...
- BZOJ1433 [ZJOI2009]假期的宿舍 二分图匹配 匈牙利算法
原文链接http://www.cnblogs.com/zhouzhendong/p/8372785.html 题目传送门 - BZOJ1433 题解 我们理一理题目. 在校的学生,有自己的床,还可以睡 ...
- [BZOJ1433][luogu_P2055][ZJOI2009]假期的宿舍
[BZOJ1433][luogu_P2055][ZJOI2009]假期的宿舍 试题描述 输入 输出 输入示例 1 3 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 输出示例 ^_^ 数据 ...
- BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2375 Solved: 1005[Submit][Sta ...
- BZOJ-1433 假期的宿舍 最大流+基础建图
网络流练习ing.. 1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1748 Solved: 765 [S ...
- bzoj1433: [ZJOI2009]假期的宿舍
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2286 Solved: 969[Submit][Stat ...
- bzoj1433:[ZJOI2009]假期的宿舍
明显的二分图最大匹配. #include<cstdio> #include<cstring> #include<cctype> #include<algori ...
- bzoj1433 [ZJOI2009]假期的宿舍(最大流)
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1717 Solved: 754[Submit][Stat ...
- BZOJ1433或洛谷2055 [ZJOI2009]假期的宿舍
BZOJ原题链接 洛谷原题链接 对于每个需要床位的人向他能睡的床连边,然后就是二分图最大匹配模板了. 这里用匈牙利算法. #include<cstdio> #include<cstr ...
随机推荐
- HTML5 拖放(Drag 和 Drop)详解与实例(转)
公司要开一个技术分享会,给我们出了几个简单的题去实现,其中有如何实现表格中列之间的拖拽,我知道html5中有个新方法可以实现,但是没有认真学习,现在闲了去学学,发现关于drag和drop的文章有很多, ...
- python之路--day6---文件处理
一.文件 1.文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件, 可以将自己的数据永久保存下来. 2.操作流程 #1. 打开文件,得到文件句柄并赋值给一个变量--f = o ...
- php析构方法
析构方法说明: 1. 析构方法会自动调用 2. 析构方法主要用于销毁资源(比如释放数据库的链接,图片资源...销毁某个对象..); 析构函数会在到对象的所有的引用都被删除或者当对象被显示销毁时执行. ...
- JAVA_SE基础——65.StringBuffer类 ②
字符串特点:字符串是常量:它们的值在创建之后不能更改. 字符串的内容一旦发生了变化,那么马上会创建一个新 的对象. 注意: 字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象 ...
- CSS揭秘(三)形状
Chapter 3 1. 椭圆 椭圆的实现主要依靠 border-radius 属性,该属性确定边框切圆角的半径大小,可以指定数值 px,也可以使用百分比显示 而且该属性非常灵活,四个角可以分别设置 ...
- Django rest framework源码分析(4)----版本
版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...
- 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- ejs注释问题
项目中遇到一个问题: 代码如下: 但是代码如下时,却不会出现bug: bug的导火索是ejs的注释: 因为我没有用对注释,所以被注释部分的if语句仍旧生效了. bug的根本原因是没有对mod类型进行判 ...
- orchard-1.9.2-1.10.2汉化
安装 首先从github上下载orchard源代码:https://github.com/OrchardCMS/Orchard(下载版本最新的1.10.2) 使用vs2017打开源代码,运行进入安装界 ...
- QT 实现在QLabel上画图
QT之所以不能再任意控件上绘图是因为QT的事件过滤器把控件的绘图事件给过滤了. 在paintevent()函数中,通常需要设置QPainter对象,创建QPainter对象的同时需要指定绘图设备,即继 ...