正题

链接:
https://www.luogu.org/record/show?rid=7930976


大意

有n个人,有的在学校有床有的没有,有的在家有的没有。现在如果有人回家了那么他就会去看望他的朋友,回家的就会空出自己的床位。每个人可以睡和自己是直接朋友关系或自己的床,要求给本来有床的并且不在家的和来看望其的朋友分配床位。


解题思路

将人和床建立二分图,我们假设每个在家的人都有床,这样不用看望朋友的就可以睡自己床,然后将除了没有床且不再家的人都作为左边点,然后将在学校的床作为右边点进行最大匹配。


代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct line{int to,next,w;
}a[10010];
int n,m,x,y,d[110],tot,state[110],school[110],num;
int head,tail,ls[110],s,e,ans,t,home[110],nn,qn;
bool ok[110],lxx[110][110];
void addl(int x,int y,int w)
{a[tot].to=y;a[tot].next=ls[x];a[tot].w=w;ls[x]=tot++;a[tot].to=x;a[tot].next=ls[y];a[tot].w=0;ls[y]=tot++;
}
bool bfs()
{head=0;tail=1;memset(d,-1,sizeof(d));d[s]=0;state[1]=s;do{head++;int x=state[head];for (int q=ls[x];q;q=a[q].next){int y=a[q].to;if (a[q].w>0 && d[y]==-1){d[y]=d[x]+1;state[++tail]=y;if (y==e) return true;}}}while (head<tail);return false;
}
int dinic(int x,int flow)
{int rest=0,k;if (x==e) return flow;for (int q=ls[x];q;q=a[q].next){int y=a[q].to;if (a[q].w>0 && d[y]==d[x]+1){rest+=(k=dinic(y,min(a[q].w,flow-rest)));a[q].w-=k;a[q^1].w+=k;if (rest==flow) return flow;}}if (!rest) d[x]=0;return rest;
}
int main()
{scanf("%d",&t);for (int ti=1;ti<=t;ti++){memset(ls,0,sizeof(ls));e=105;s=104;tot=2;num=0;scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&school[i]);if(school[i]) addl(i+n,e,1);//床}for (int i=1;i<=n;i++){scanf("%d",&home[i]);if (!school[i]||(school[i]&&!home[i])) addl(s,i,1),num++;//需要匹配的人}for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){scanf("%d",&x);if (x||i==j)addl(i,j+n,1);//和自己或直接朋友的床匹配}}ans=0;while (bfs()) ans+=dinic(s,2147483647);if (ans==num) printf("^_^\n");else printf("T_T\n");}
}

小技巧

其实有些时候可以将本来不需要的在其他地方分配掉可能可以降低难度

P2055-假期的宿舍【网络流,最大流,最大匹配】相关推荐

  1. 【BZOJ1433】【codevs2347】假期的宿舍,最大流

    传送门1 传送门2 写在前面:蛤蛤 思路: (要拆点啊!naive的我一开始没拆点竟然还过了4个点) 每个人拆成两个点,一个在源点那里,一个在汇点那里 1.s连本校学生,容量为1的边(发床了) 2.没 ...

  2. 【二分图】洛谷P2055假期的宿舍

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

  3. POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)

    题目链接:点击查看 题目大意:给出n头奶牛,奶牛们现在要晒太阳,每头奶牛需要[l,r]区间内的光照强度,现在有m种防晒霜,每种防晒霜可以让奶牛接受到val数值的光照强度,然后每种防晒霜只有num个,现 ...

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

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

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

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

  6. 【bzoj1532】[POI2005]Kos-Dicing 二分+网络流最大流

    题目描述 Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的 ...

  7. 【图论】网络流——最大流和最小费用流

    [图论]网络流--最大流和最小费用流 文章目录 [图论]网络流--最大流和最小费用流 1. 最大流问题 1.1 基本概念 1.2 寻求最大流的算法(Ford-Fulerson) 1.3 matlab求 ...

  8. 网络流最大流初步-Push–relabel maximum flow algorithm

    简介 做网络流最大流的题,常用的算法就是Dinic's algorithm.时间复杂度为,通常由于出题人水平较低,几乎能过所有的题.功利地看,这样就没问题了.但是,站在追求真(zhuang)理(B)的 ...

  9. (通俗易懂小白入门)网络流最大流——EK算法

    网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...

最新文章

  1. 16年前卖猪肉的北大高材生如今怎么样了?
  2. 实现一个简单的WebSocket聊天室
  3. PHP输出表格的方法
  4. sqlplus 汉字乱码问题的解决
  5. JavaCV 学习(一):JavaCV 初体验
  6. 笔记-高项案例题-2016年上-范围管理+沟通管理+进度管理+风险管理
  7. 蛮力写算法_蛮力算法解释
  8. java中注解的使用与实例(一)
  9. Solidity常见问题
  10. 《Puppet权威指南》——第1章 运维工程师的利器——自动化运维工具
  11. 印象笔记Mac版的快捷键有哪些?Evernote for Mac快捷键大全
  12. Redis下载与安装 Linux + Windows 较详细步骤
  13. 开发手札:Unity与Android交互
  14. discuz论坛中,如何上传并插入一段本地视频,并支持实时展示、实时播放
  15. 制作森林图-简单明了
  16. 王爽汇编语言 实验8
  17. vue中el-table插槽内容使用show-overflow-tooltip属性无法显示省略号问题-附解决方法
  18. 硬盘低级格式化全攻略
  19. SCOI2016 Day2 简要题解
  20. 怎么处理U盘无法正常弹出的情况?

热门文章

  1. 后端接口重定向_接口自动化面试题,建议收藏!
  2. 百度云cdn设置州五年制大专_[百度云CDN]配置过程坑点集合
  3. java的编译器怎么出来_怎样掌握ava编译器的使用,教程在这里,如何进行Java初级学习...
  4. [JavaWeb-XML]约束(DTD,Schema)
  5. [PAT乙级]1004 成绩排名
  6. C++实现线段树RMQ-单点修改,区间查询
  7. Calendar Game POJ - 1082(关于日历的博弈问题)
  8. java 开源控件_一些好用的开源控件
  9. mysql多实例复制,Mysql实例使用Rotate Master实现MySQL 多主复制的实现方法
  10. 蓝桥杯 k倍区间 前缀和