BZOJ 1433 && Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法
刚学了匈牙利正好练练手(我不会说一开始我写错了)(怕不是寒假就讲了可是我不会)
把人看做左部点,床看作右部点
建图:(!!在校相当于有床,不在校相当于没有床 但是要来学校)
1.在校的 不走的人 自己和自己的床连边;
2.不在校的人或在校不回家的人 和 认识的 并且 在校的人 的床 连边;
于是统计一下需要几张床,再跑匈牙利算法、、、看看够不够。
#include<cstdio>
#include<iostream>
#include<cstring>
#define R register int
using namespace std;
inline int g() {
R ret=; register char ch; while(!isdigit(ch=getchar()));
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
}
int t,n,cnt,ans,tot;
int vr[],nxt[],fir[],pre[];
inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
bool vis[],h[],s[];
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=;
memset(pre,,sizeof(pre)),memset(fir,,sizeof(fir)),memset(nxt,,sizeof(nxt)),memset(vr,,sizeof(vr));
n=g(); for(R i=;i<=n;++i) s[i]=g();
for(R i=;i<=n;++i) {
h[i]=g(); if(!h[i]&&s[i]) add(i,i+n),add(i+n,i);
}
for(R i=;i<=n;++i) for(R j=,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=;i<=n;++i) if(!s[i]||(s[i]&&!h[i])) ++tot;
for(R i=;i<=n;++i) if(!s[i]||(s[i]&&!h[i])) {
memset(vis,,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=; register char ch; while(!isdigit(ch=getchar()));
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
}
int t,n,cnt,ans,tot;
int vr[],nxt[],fir[],pre[];
inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
bool vis[],h[],s[];
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=;
memset(pre,,sizeof(pre)),memset(fir,,sizeof(fir)),memset(nxt,,sizeof(nxt)),memset(vr,,sizeof(vr));
n=g(); for(R i=;i<=n;++i) s[i]=g();
for(R i=;i<=n;++i) {
h[i]=g(); if(!h[i]&&s[i]) add(i,i);
}
for(R i=;i<=n;++i) for(R j=,x;j<=n;++j) {
x=g(); if(x&&s[j]) add(i,j);
}
for(R i=;i<=n;++i) if(!s[i]||(s[i]&&!h[i])) ++tot;
for(R i=;i<=n;++i) if(!s[i]||(s[i]&&!h[i])) {
memset(vis,,sizeof(vis)); ans+=dfs(i);
} ans==tot?printf("^_^\n"):printf("T_T\n");
}
}
2019.04.14
BZOJ 1433 && Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法的更多相关文章
- Luogu P2055 [ZJOI2009]假期的宿舍
一道网络有关的问题,还是一句话 网络流重在建模! 这里主要讲两种算法. 1.二分图匹配: 分析题意,我们可以知道题目要求是让所有留在学校的人都能有床睡 而 所有留在学校的人=本校不回家的人+外校的人: ...
- 洛谷P2055 [ZJOI2009]假期的宿舍
P2055 [ZJOI2009]假期的宿舍 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A ...
- 洛谷——P2055 [ZJOI2009]假期的宿舍
P2055 [ZJOI2009]假期的宿舍 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 ...
- P2055 [ZJOI2009]假期的宿舍 题解(二分图)
题目链接 P2055 [ZJOI2009]假期的宿舍 解题思路 因为懒,提供一种不连边,直接根据题目给出的邻接矩阵进行匈牙利算法的思路. \(a[i][j]\)表示\(i\)能不能睡\(j\)的床,需 ...
- 洛谷 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]假期的宿舍
思路 看到复杂的匹配条件,发现要让一个人和一个床匹配,所以就每个有床的人(指本校学生)和t连一条边,每个需要床的人(指外校的人和不回家的人)和s连一条边,i和j互相认识就把i和j的床连在一起,自己和自 ...
- P2055 [ZJOI2009]假期的宿舍[二分图匹配]
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题. 比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识 ...
随机推荐
- HTML/CSS实现的搜索框
谷歌和百度首页的搜索框都是<input>+<button>模式的,bing的搜索框感觉要好点儿.简言之,就是将提交按钮放到<input>中,其实这是做不到的,只能伪 ...
- 国画经典之梅花PSD素材
国画经典之梅花图片PSD素材,由huiyi8素材网提供. 地址:http://www.huiyi8.com/meihua/
- 【HDU 6126】Give out candies 最小割
题意 有$n$个小朋友,给每个人分$1~m$个糖果,有k个限制 限制形如$(x,y,z)$ 表示第$x$个人分到的糖数减去第$y$个人分到的糖数不大于$z$,给第$i$个人$j$颗糖获 ...
- (转)HLS协议,html5视频直播一站式扫盲
本文来自于腾讯bugly开发者社区,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277 视频直播这么火,再不学就 ou ...
- Codeforces 758A. Holiday Of Equality 贪心
题目大意: 给定一个长为\(n\)序列,每次操作在一个数上+1,求最小的操作次数使所有的数大小相同. 题解: 对这种题无话可说 #include <cstdio> #include < ...
- mac内置的FTP工具
在 Mac OS X 系统下,有不少优秀的 FTP 工具,如 Cyberduck.Transmit,但是你是否知道除了这些第三方应用,系统已经为你准备好了一个内置的 FTP 工具?/ M: e0 J% ...
- poj2777Count Color——线段树+状压
题目:http://poj.org/problem?id=2777 状压每个颜色的选择情况,取答案时 | 一番: 注意题目中的区间端点可能大小相反,在读入时换一下位置: 注意pushdown()中要l ...
- 利用MEF实现插件机制(可根据输入类型来加载特定dll)
最近在做PACS的项目中想利用插件来加载各个不同的SCP的操作实现.比如Worklist的查询数据库,可以有多个实现. 比如MPPS的更新,也可以有多个实现. 为了统一弹性处理插件模块,增加了类型输入 ...
- Python创建删除文件
Python代码如下: import os directory = "E:\\学习日志\\" os.chdir(directory) # 改变当前工作目录 cwd = os.get ...
- [CentOS] 结合Nginx部署DotNetCore的demo项目【转载】
部署前准备 1.VisualStudio2017+.netcore2.0SDK 2.Centos7.2 3.SecureCRT,Xftp(根据自己喜好) 创建WebApi项目 修改Program.cs ...