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 不认识 ...
随机推荐
- Linux-DHCP服务器的搭建
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理.分配IP地址,使网络环境中的主机动态的获得I ...
- python做简易记事本
以下内容参考<辛星tkinter教程第二版>: from tkinter import * from tkinter.filedialog import * from tkinter.me ...
- 数据可视化入门之show me the numbers
数据的可视化一直是自己瞎玩着学,近来想系统的学数据可视化的东西,于是搜索资料时看到有人推荐<show me the numbers>作为入门. 由于搜不到具体的书籍内容,只能 ...
- RPM包构建
参考资料 https://docs-old.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html-single/RPM_Guide/i ...
- 字典树Trie的使用
1. Trie树介绍 Trie,又称单词查找树.前缀树,是一种多叉树结构.如下图所示: 上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, ...
- Oracle的case 用法
1.测试表declare @stuinfo table(id int, sname nvarchar(20), ///小组名称 gender varchar(1), //小组性别 sgroup int ...
- springboot 1.5.x中的动态切换日志级别
logback是一套日志框架,由log4j的优化版,由同一个作者开发,在速度和性能上都超过其他日志框架,再结合slf4j,已成为当前最流行的日志框架. 一.springboot中使用logback s ...
- python 抓取美丽说店铺的宝贝图片及详细信息的实现(爬虫)
对于页面的抓取,我们使用的是requests,现在大部分的网站都支持动态加载,我们在firefox f12后查找动态的url :http://www.meilishuo.com/aj/shop_lis ...
- Ternary Calculation
Ternary Calculation Time Limit : /2000ms (Java/Other) Memory Limit : /65536K (Java/Other) Total Subm ...
- Jenkins远程执行shell出现java: command not found
之前在使用Jenkins执行远程shell脚本时,出现提示java: command not found:多方查找原因后发现是因为远程执行shell脚本时,不会自动加载环境变量,导致出现此错误,解决方 ...