题目描述

学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题。

比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识。我们假设每个人只能睡和自己直接认识的人的床。那么一个解决方案就是 B 睡 A 的床而 C 睡 B 的床。而实际情况可能非常复杂,有的人可能认识好多在校学生,在校学生之间也不一定都互相认识。

我们已知一共有 n 个人,并且知道其中每个人是不是本校学生,也知道每个本校学生是否回家。问是否存在一个方案使得所有不回家的本校学生和来看他们的其他人都有地方住。

解析

看一眼,哦吼,二分图最大匹配没得跑了。

显然留在学校没走的人(包括在校学生和外来人)都要与一张床匹配,而在校学生(包括走了的)都有床。那么我们可以把所有在学校的人当作左部节点,把所有床当作右部节点,如果最大匹配\(=\)留在学校的学生人数,该方案可行。

匈牙利或者最大流,我写的最大流,练练手。

参考代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#define N 51
#define M 10010
#define INF 0x3f3f3f3f
using namespace std;
inline int read()
{
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
struct rec{
int next,ver,leng;
}g[M<<1];
int head[M],tot,d[M],n,num;
int is[N],home[N];
inline void add(int x,int y,int val)
{
g[++tot].ver=y,g[tot].leng=val;
g[tot].next=head[x],head[x]=tot;
}
inline bool bfs()
{
memset(d,0,sizeof(d));
queue<int> q;
d[0]=1;q.push(0);
while(q.size()){
int x=q.front();q.pop();
for(int i=head[x];i;i=g[i].next){
int y=g[i].ver,z=g[i].leng;
if(!z||d[y]) continue;
d[y]=d[x]+1;
q.push(y);
if(y==n*2+1) return 1;
}
}
return 0;
}
inline int dinic(int x,int flow)
{
if(x==n*2+1) return flow;
int rest=flow;
for(int i=head[x];i;i=g[i].next){
int y=g[i].ver,z=g[i].leng;
if(!z||d[y]!=d[x]+1) continue;
int k=dinic(y,min(rest,z));
if(!k) d[y]=0;
else{
g[i].leng-=k;
g[i^1].leng+=k;
rest-=k;
}
}
return flow-rest;
}
int main()
{
int T;
T=read();
while(T--){
memset(head,0,sizeof(head));
memset(is,0,sizeof(is));//在校学生为 1
memset(home,0,sizeof(home));//回家的人为 1
tot=1,num=0;
n=read();
for(int i=1;i<=n;++i){
is[i]=read();
if(is[i]) add(i+n,n*2+1,1),add(n*2+1,i+n,0);
}
for(int i=1;i<=n;++i){
home[i]=read();
if(!home[i]||!is[i]) add(0,i,1),add(i,0,0),num++;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
int x=read();
if(j>i) continue;
if(i==j&&!home[i]) add(i,i+n,1),add(i+n,i,0);
else if(x) add(i,j+n,1),add(j+n,i,0),add(j,i+n,1),add(i+n,j,0);
}
int now,ans=0;
while(bfs())
while((now=dinic(0,INF))) ans+=now;
if(ans==num) printf("^_^\n");
else printf("T_T\n");
}
return 0;
}

P2055 [ZJOI2009]假期的宿舍[二分图匹配]的更多相关文章

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

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

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

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

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

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

  4. 洛谷P2055 [ZJOI2009]假期的宿舍 [二分图最大匹配]

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

  5. 洛谷 2055 [ZJOI2009]假期的宿舍——二分图匹配

    题目:https://www.luogu.org/problemnew/show/P2055 #include<iostream> #include<cstdio> #incl ...

  6. P2055 [ZJOI2009]假期的宿舍 题解(二分图)

    题目链接 P2055 [ZJOI2009]假期的宿舍 解题思路 因为懒,提供一种不连边,直接根据题目给出的邻接矩阵进行匈牙利算法的思路. \(a[i][j]\)表示\(i\)能不能睡\(j\)的床,需 ...

  7. 洛谷P2055 [ZJOI2009]假期的宿舍

    P2055 [ZJOI2009]假期的宿舍 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A ...

  8. 洛谷——P2055 [ZJOI2009]假期的宿舍

    P2055 [ZJOI2009]假期的宿舍 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 ...

  9. 洛谷 P2055 [ ZJOI 2009 ] 假期的宿舍 —— 二分图匹配

    题目:https://www.luogu.org/problemnew/show/P2055 二分图匹配: 注意要连边的话对方必须有床! 代码如下: #include<iostream> ...

随机推荐

  1. MiniProfiler 来分析 ASP.NET Core

    使用 MiniProfiler 来分析 ASP.NET Core 应用   使用 MiniProfiler 来分析 ASP.NET Core 应用 MiniProfiler(https://minip ...

  2. tp5之服务器不显示验证码

    今天在使用tp框架的时候遇到的一个bug,前辈们早已有解决方法,遇到了做个笔记 TP5框架,自带的验证码在本地localhost运行是没问题的,可以正常显示,如图: 然后,把框架拿到服务器是去运行,验 ...

  3. Python之 random 模块

    #!/usr/bin/env python # -*- coding:utf8 -*- import random ''' 如果想要随机的内容的话,就可以使用这个模块来完成 ''' ######### ...

  4. yzoj2424 小迟的数字 题解

    题意:如果一个数字用十进制表示,有大于等于1个1,或者大于等于2个2,或者大于等于3个3,或者大于等于4个4,或者大于等于5个5,或者大于等于6个6,或者大于等于7个7,或者大于等于8个8,或者大于等 ...

  5. springboot项目 配置https

    感谢  https://www.jianshu.com/p/1b7b9e0803c6 帮我解决了问题 生成自签名证书 keytool -genkey -storetype PKCS12 -keysiz ...

  6. python threading模块的Lock和RLock区别

    首先了解这两者是什么. 以下说明参考自python官网 Lock:Lock被称为①原始锁,原始锁是一个②在锁定时不属于特定线程的同步基元组件,它是能用的最低级的同步基元组件.原始锁处于 "锁 ...

  7. zipkin的安装与搭建

    下载与部署 jar中yaml文件配置 启动传入并参数 web界面 目录 zipkin是分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪. 下载与部署 wget -O zipki ...

  8. SpirngBoot--错误消息的定制

    在SpringBoot中发生了4xx 5xx之类的错误,SpringBoot默认会发一个/error的请求,该请求由BasicErrorController处理,即在SpringBoot中错误处理也是 ...

  9. Eclipse 安装反编译插件 Eclipse Class Decompiler

    Eclipse Class Decompiler在线安装方法 https://blog.csdn.net/tangjinquan1157/article/details/77506015 Eclips ...

  10. Python 3 配置文件处理

    首先安装环境 创建配置文件和读取文件 config.ini 内容 [email] mail_server=xxxxx mail_username=xxxx mail_password=xxxxx ma ...