刚学了匈牙利正好练练手(我不会说一开始我写错了)(怕不是寒假就讲了可是我不会)

把人看做左部点,床看作右部点

建图:(!!在校相当于有床,不在校相当于没有床 但是要来学校)

  1.在校的 不走的人 自己和自己的床连边;

  2.不在校的人或在校不回家的人 和 认识的 并且 在校的人 的床 连边;

于是统计一下需要几张床,再跑匈牙利算法、、、看看够不够。

#include<cstdio>
#include<iostream>
#include<cstring>
#define R register int
using namespace std;
inline int g() {R ret=0; register char ch; while(!isdigit(ch=getchar()));do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret;
}
int t,n,cnt,ans,tot;
int vr[10010],nxt[10010],fir[101],pre[101];
inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
bool vis[101],h[101],s[101];
bool dfs(int u) {for(R i=fir[u];i;i=nxt[i]) {R v=vr[i];if(vis[v]) continue; vis[v]=true;if(!pre[v]||dfs(pre[v])) {pre[v]=u; return true;}} return false;
}
signed main() {t=g();while(t--) { cnt=tot=ans=0;memset(pre,0,sizeof(pre)),memset(fir,0,sizeof(fir)),memset(nxt,0,sizeof(nxt)),memset(vr,0,sizeof(vr));n=g(); for(R i=1;i<=n;++i) s[i]=g();for(R i=1;i<=n;++i) {h[i]=g(); if(!h[i]&&s[i]) add(i,i+n),add(i+n,i);}for(R i=1;i<=n;++i) for(R j=1,x;j<=n;++j) {x=g();               if(x&&i!=j) {if(s[j]&&((s[i]&&!h[i])||!s[i])) add(i,j+n),add(j+n,i);if(s[i]&&((s[j]&&!h[j])||!s[j])) add(j,i+n),add(i+n,j);}}for(R i=1;i<=n;++i) if(!s[i]||(s[i]&&!h[i])) ++tot;for(R i=1;i<=n;++i) if(!s[i]||(s[i]&&!h[i])) {memset(vis,0,sizeof(vis)); ans+=dfs(i);} ans==tot?printf("^_^\n"):printf("T_T\n");}
}

然而有种更厉害的建图,但是我不会。。。哪位大佬给讲讲QAQ,如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#define R register int
using namespace std;
inline int g() {R ret=0; register char ch; while(!isdigit(ch=getchar()));do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret;
}
int t,n,cnt,ans,tot;
int vr[2510],nxt[2510],fir[51],pre[51];
inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
bool vis[51],h[51],s[51];
bool dfs(int u) {for(R i=fir[u];i;i=nxt[i]) {R v=vr[i];if(vis[v]) continue; vis[v]=true;if(!pre[v]||dfs(pre[v])) {pre[v]=u; return true;}} return false;
}
signed main() {t=g();while(t--) { cnt=tot=ans=0;memset(pre,0,sizeof(pre)),memset(fir,0,sizeof(fir)),memset(nxt,0,sizeof(nxt)),memset(vr,0,sizeof(vr));n=g(); for(R i=1;i<=n;++i) s[i]=g();for(R i=1;i<=n;++i) {h[i]=g(); if(!h[i]&&s[i]) add(i,i);}for(R i=1;i<=n;++i) for(R j=1,x;j<=n;++j) {x=g(); if(x&&s[j]) add(i,j);}for(R i=1;i<=n;++i) if(!s[i]||(s[i]&&!h[i])) ++tot;for(R i=1;i<=n;++i) if(!s[i]||(s[i]&&!h[i])) {memset(vis,0,sizeof(vis)); ans+=dfs(i);} ans==tot?printf("^_^\n"):printf("T_T\n");}
}


2019.04.14

转载于:https://www.cnblogs.com/Jackpei/p/10707186.html

BZOJ 1433 Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法相关推荐

  1. Luogu P2055 [ZJOI2009]假期的宿舍

    这个建图真玄.jpg 简直是常识题 然而我常识不足QwQ 话说题解里的代码在我看来不美观所以抄不了题解 于是debug一个小时QwQ 给萌新一点活路吧 #include<cstdio> # ...

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

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

  3. 洛谷P2055 [ZJOI2009]假期的宿舍 题解

    题目链接: https://www.luogu.org/problemnew/show/P2055 分析: 这道题比较简单,二分图的练习题(当然最大流同理). 易得我们可以将人放在一侧,床放在一侧. ...

  4. P2055 [ZJOI2009]假期的宿舍

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

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

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

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

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

  7. 【BZOJ 1433】[ZJOI2009]假期的宿舍

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把每个人都分为左边和右边两个人 xi,yi 如果第i个人不回家或者是外校学生 那么它可以和他认识的人连一条容量为1的边(前提是这个认 ...

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

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

  9. [ZJOI2009]假期的宿舍

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

最新文章

  1. mac 黑窗口连接mysql_Mac下安装配置MySQL
  2. llinux的shell脚本编程详解
  3. springboot页面乱码问题
  4. 5.1 入门整合案例(SpringBoot+Spring-data-elasticsearch) ---- good
  5. 宝塔linux面板假设nextcloud,宝塔面板部署NextCloud(14.0.3)逐一解决后台安全及设置警告...
  6. 怎么用java ee编程_Java EE应用程序入门 - 编程入门网
  7. Docker快速搭建Taiga敏捷开发项目管理平台
  8. Windows 7中打开IIS的远程访问
  9. linux内核内存映射实验报告,动手实践-Linux内存映射基础(上)
  10. java_day01
  11. php缩放gif和png图透明背景变成黑色的解决方法_php技巧
  12. Atitit nodejs js 获取图像分辨率 尺寸 大小 宽度 高度
  13. ElementUI简单分页
  14. 关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat...
  15. 暴力猴加脚本的适当应用
  16. 【论文笔记】基于聚类特征深度LSTM的语音情感识别
  17. python爬取大众点评字体_python采集大众点评(字体反爬)
  18. 简单C语言程序的编写,c语言编写简单程序.doc
  19. SpringAop实现原理
  20. 家庭局域网_分析 | 如何查询局域网内在用的IP地址?

热门文章

  1. 警惕黑客破坏网络安全
  2. 新笔记本怎么在桌面添加计算机文件夹,win10桌面悬浮文件夹怎么弄_win10电脑桌面悬浮文件夹如何添加-win7之家...
  3. Makefile文件的使用
  4. hibernate中List一对多映射关系详解
  5. struts2之单个文件上传
  6. 实现DFS之“油田”
  7. 深入理解TCP/IP协议族
  8. Zephyr内核到1.5版本的改进
  9. 常考数据结构与算法:二叉树的之字形层序遍历
  10. 常考数据结构与算法:查找第K大元素算法