【链接】 我是链接,点我呀:)
【题意】

在这里输入题意

【题解】

把每个人都分为左边和右边两个人
xi,yi
如果第i个人不回家或者是外校学生
那么它可以和他认识的人连一条容量为1的边(前提是这个认识的人是本校的学生)
(从左边连向右边
然后源点向每个不回家的本校人或者外校人连一条容量为1的边。
(边的终点是左边的人
每个不是外校的人向汇点T连一条容量为1的边。
(边的起点是右边的人
做一下最大流就可以了
看看最大流和需要安排床位的人的人数相同不相同就可以了
(其实也就是二分图匹配,每条匹配就对应了给每个人分配一个床位的过程
(左边是需要分配床位的那些人,右边是有床的人。。

【代码】

#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
const int N = 50;int n,r[N+10],l[N+10],cnt,a[N+10][N+10];struct abc{int en,nex;LL flow;
};int s,t,deep[N*2+20];
int fir[N*2+10],tfir[N*2+10],totm;
abc bian[2*N*N+4*N+10];
queue <int> dl;void add(int x,int y,LL cost){bian[totm].nex = fir[x];fir[x] = totm;bian[totm].en = y,bian[totm].flow = cost;totm++;bian[totm].nex = fir[y];fir[y] = totm;bian[totm].en = x,bian[totm].flow = 0;totm++;
}bool bfs(int s,int t){dl.push(s);memset(deep,255,sizeof deep);deep[s] = 0;while (!dl.empty()){int x = dl.front();dl.pop();for (int temp = fir[x]; temp!= -1 ;temp = bian[temp].nex){int y = bian[temp].en;if (deep[y]==-1 && bian[temp].flow>0){deep[y] = deep[x] + 1;dl.push(y);}}}return deep[t]!=-1;
}LL dfs(int x,int t,LL limit){if (x == t) return limit;if (limit == 0) return 0;LL cur,f = 0;for (int temp = tfir[x];temp!=-1;temp = bian[temp].nex){tfir[x] = temp;int y = bian[temp].en;if (deep[y] == deep[x] + 1 && (cur = dfs(y,t,min(limit,(LL)bian[temp].flow))) ){f += cur;limit -= cur;bian[temp].flow -= cur;bian[temp^1].flow += cur;if (!limit) break;}}return f;
}int main(){#ifdef LOCAL_DEFINEfreopen("rush_in.txt", "r", stdin);#endifios::sync_with_stdio(0),cin.tie(0);int T;cin>>T;while (T--){int students = 0;//如果不是在校学生 那么右边没有点//因为他没有床位,不用考虑这个点的入度totm = 0;memset(fir,255,sizeof fir);memset(r,0,sizeof r);memset(l,0,sizeof l);cnt = 0;cin >> n;for (int i = 1;i <= n;i++){int x;cin >> x;if (x==1) r[i]=++cnt;}//如果回家的话,左边没有和他相关的点。//不用考虑这个点的出度for (int i = 1;i <= n;i++){int x;cin >> x;if (r[i]==0) {l[i] = ++cnt;students++;continue;}if (x==0) {l[i] = ++cnt;students++;}}for (int i = 1;i <= n;i++)for (int j = 1;j <= n;j++)cin >> a[i][j];for (int i = 1;i <= n;i++){//是本校学生,但是回家//不用给它安排if (l[i]==0){continue;}if (l[i]>0 && r[i]==0){//不是本校学生for (int j = 1;j <= n;j++)if (i!=j && a[i][j] && r[j]!=0){//那个人必须是本校学生add(l[i],r[j],1);}}//是本校学生,且不走if (l[i]>0 && r[i]>0){for (int j = 1;j <= n;j++)if ( (a[i][j] && r[j]!=0) || (i==j)){add(l[i],r[j],1);}}}for (int i = 1;i <= n;i++)if (l[i]!=0){//这个人不回家add(0,l[i],1);}++cnt;for (int i = 1;i <= n;i++)if (r[i]!=0){//不是外校的学生就有床位add(r[i],cnt,1);}s = 0;t = cnt;int ans = 0;while (bfs(s,t)){for (int i = 0;i <= cnt;i++) tfir[i] = fir[i];ans += dfs(s,t,1000);}if (ans==students){cout<<"^_^"<<endl;}else{cout<<"T_T"<<endl;}}return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/9089242.html

【BZOJ 1433】[ZJOI2009]假期的宿舍相关推荐

  1. 1433. [ZJOI2009]假期的宿舍【二分图】

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

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

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

  3. 二分图 洛谷P2055 [ZJOI2009]假期的宿舍

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

  4. BZOJ 1433 Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法

    刚学了匈牙利正好练练手(我不会说一开始我写错了)(怕不是寒假就讲了可是我不会) 把人看做左部点,床看作右部点 建图:(!!在校相当于有床,不在校相当于没有床 但是要来学校) 1.在校的 不走的人 自己 ...

  5. [ZJOI2009]假期的宿舍

    https://www.luogu.org/problemnew/show/P2055 https://www.lydsy.com/JudgeOnline/problem.php?id=1433 题解 ...

  6. P2055 [ZJOI2009]假期的宿舍

    有点烧脑... 这道题是求二分图完美匹配.没看请题意还不知道是求完美匹配,结果爆零. 人一共分三种: 在校学生 && 回家.这类人拥有一个床,但是不睡. 在校学生 && ...

  7. BZOJ1433 [ZJOI2009]假期的宿舍 - 二分图匹配

    题解 一道裸的二分图匹配,稍微有一点细节需要注意, 但是非常裸= = 本校并且住校的向自己的床和 自己认识的并且本校的人的床连边 离校的不需要向外连边 不是本校的就和自己认识的 并且是本校的人的床连边 ...

  8. bzoj1433: [ZJOI2009]假期的宿舍

    一道匈牙利的裸题,将床和人建边,纯属复习模版了(然而就是写错了) 注意一下0和1的表示. #include<cstdio> #include<cstring> using na ...

  9. P2055 [ZJOI2009]假期的宿舍(二分图匹配)

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

最新文章

  1. 熵增学院-Anders-剑走偏锋,了解Spring Boot内部Servlet容器
  2. 数字经济论坛、阿里研究院、毕马威联合发布《2018全球数字经济发展指数》
  3. Oracle 原理:逻辑备份和恢复
  4. Flink 架构:三层架构体系、运行时组件
  5. Visual Studio“Orcas”October 2006 CTP版下载
  6. 怎么用计算机改变声音的音调,调音台使用教程大全
  7. casbin-权限管理
  8. [论文写作] vscode + latex
  9. 高可用,完全分布式Hadoop集群HDFS和MapReduce安装配置指南
  10. bat 设置变量带中文
  11. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
  12. 群晖经典第三方套件_强烈推荐群晖下载套件玩物下志
  13. 笔记本电脑触摸板手势操作
  14. Draco使用笔记(1)——图形解压缩
  15. vue 拖拽【单个div实现拖拽】
  16. 2017年第四八届C/C++ B组蓝桥杯省赛真题
  17. 在c语言中我叫做符号变量,问渠网-C语言基础-第一节 关键字符号与变量
  18. 忻州师范学院计算机系男女比例,忻州师范学院排名2021 山西排名第13全国排名第570...
  19. Mac在终端直接使用root权限
  20. 计算机教师的名言是,教师的名言

热门文章

  1. 【阿里云IoT+YF3300】7.物联网设备表达式运算
  2. 关于网上很不好找的幼儿识图APP
  3. CC1310 WOR如何设置几秒钟醒一次
  4. vue 校验表单报错:model is required for validate to wor
  5. doc跟docx的区别
  6. k8s tekton 实现CI流程,从git到docker registry
  7. callback 回调函数
  8. C/C++ 操作ini文件(SinpleIni 跨平台库)
  9. JS toFixed(2) 返回 -0.00
  10. python 爬虫 --字符编写问题