洛谷——P2055 [ZJOI2009]假期的宿舍
P2055 [ZJOI2009]假期的宿舍
学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题。比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识。我们假设每个人只能睡和自己直接认识的人的床。那么一个解决方案就是 B 睡 A 的床而 C 睡 B 的床。而实际情况可能非常复杂,有的人可能认识好多在校学生,在校学生之间也不一定都互相认识。我们已知一共有 n 个人,并且知道其中每个人是不是本校学生,也知道每个本校学生是否回家。问是否存在一个方案使得所有不回家的本校学生和来看他们的其他人都有地方住。
显然的二分图匹配,这个图要分成两部分,一部分是人,另一部分是床
建图:1.如果这个人在校且不回家,那么就连$i$到$i$一条边,表示这个人于这个床匹配
2.如果这个人不在校且其朋友在校,就表明这个人可以睡在他朋友的床上,连接$i$到$j$
注意初始化
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define N 260
using namespace std; int head[N],tot;
struct nodE{
int to,next;
}e[N];
void add(int u,int v){
e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
} int n,dfn[N],match[N],ans,sum;
int in[N],gh[N]; void init(){
memset(head,,sizeof(head));
memset(e,,sizeof(e));
memset(dfn,,sizeof(dfn));
memset(match,,sizeof(match));
tot=ans=sum=;
} bool dfs(int u,int t){
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(dfn[v]!=t){
dfn[v]=t;
if(!match[v]||dfs(match[v],t)){
match[v]=u;return true;
}
}
}
return false;
} int t;
int main()
{
scanf("%d",&t);
while(t--){
init();
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&in[i]);
for(int i=;i<=n;i++){
scanf("%d",&gh[i]);
if(!in[i]||(in[i]&&!gh[i])) ++sum;
if(in[i]&&!gh[i]) add(i,i);
}
for(int i=;i<=n;i++){
for(int x,j=;j<=n;j++){
scanf("%d",&x);
if(x&&in[j]) add(i,j);
}
}
for(int i=;i<=n;i++)
if((in[i]&&!gh[i])||!in[i]){
if(dfs(i,i)) ++ans;
} if(ans==sum) printf("^_^\n");
else printf("T_T\n");
} return ;
}
洛谷——P2055 [ZJOI2009]假期的宿舍的更多相关文章
- 洛谷P2055 [ZJOI2009]假期的宿舍
P2055 [ZJOI2009]假期的宿舍 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A ...
- 洛谷 P2055 [ZJOI2009]假期的宿舍
洛谷 P2055 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C ...
- 洛谷P2055 [ZJOI2009]假期的宿舍 题解
题目链接: https://www.luogu.org/problemnew/show/P2055 分析: 这道题比较简单,二分图的练习题(当然最大流同理). 易得我们可以将人放在一侧,床放在一侧. ...
- 洛谷P2055 [ZJOI2009]假期的宿舍 [二分图最大匹配]
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识. ...
- 洛谷$P2055\ [ZJOI2009]$ 假期的宿舍 最大流
正解:最大流 解题报告: 传送门$QwQ$ 这种一看就很网络流鸭,直接说咋建图趴. 考虑把在校的人拆成人和床.$S$连向所有不回家的人,所有床连向$T$,认识的人之间人向床连边,跑个最大流就成. $o ...
- 洛谷 P2055 【假期的宿舍】
题库 :洛谷 题号 :2055 题目 :假期的宿舍 link :https://www.luogu.org/problem/P2055 首先明确一下:校内的每个学生都有一张床(只是校内的有) 思路 : ...
- BZOJ1433或洛谷2055 [ZJOI2009]假期的宿舍
BZOJ原题链接 洛谷原题链接 对于每个需要床位的人向他能睡的床连边,然后就是二分图最大匹配模板了. 这里用匈牙利算法. #include<cstdio> #include<cstr ...
- 洛谷2055 [ZJOI2009]假期的宿舍
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识. ...
- 洛谷 2055 [ZJOI2009]假期的宿舍——二分图匹配
题目:https://www.luogu.org/problemnew/show/P2055 #include<iostream> #include<cstdio> #incl ...
随机推荐
- 关于eclipse部署项目后,在tomcat中的webapps文件夹下没有项目
转自:https://blog.csdn.net/yang505581644/article/details/78802316 一.发现问题 在eclipse中新建Dynamic Web Projec ...
- Wait示例分析
wait方法使"当前线程"进入阻塞(等待)状态. 示例分析: public class TestWait { public static void main(String[] ar ...
- Eclipse如何打开Android工程(转载)
转自:http://www.cnblogs.com/kernel-style/p/3339102.html 一.Eclipse如何打开Android工程 1.你可以在file->new-> ...
- 【插件开发】—— 11 窃听风云(Java事件监听原理-GEF实例讲解)
前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭配 6 SWT复杂空间与布局搭配 7 SWT布局详解 ...
- 第五篇(那些JAVA程序BUG中的常见单词)
The left-hand side of an assignment must be a variable 赋值的左侧必须是变量 left-hand side 左边 assignment 赋值
- 《windows核心编程系列》二十一谈谈基址重定位和模块绑定
每个DLL和可执行文件都有一个首选基地址.它表示该模块被映射到进程地址空间时最佳的内存地址.在构建可执行文件时,默认情况下链接器会将它的首选基地址设为0x400000.对于DLL来说,链接器会将它的首 ...
- maven项目管理1
1.maven的目录结构 src -main -java -package -test -java -package resources 2.maven命令 mvn -v :查看maven版本命令 c ...
- C# KeepAlive的设置
C# KeepAlive的相关设置 网上有很多相关KeepAlive的内容,终于找到了有关C#的这方面资料,设置了下,有行可靠! TcpListener myListener = new TcpLis ...
- jdk线程池,使用手记
Executors----------------------------------------------Executors------------------------------------ ...
- hihocoder offer收割编程练习赛10 C 区间价值
思路: 令v[l, r](0<= l <= r < n)表示区间[l,r]的价值,则长度为n的区间的价值最少为0,最多为n*(n-1)/2.整体对价值二分,求能满足sum{v[l, ...