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

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

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

  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]假期的宿舍 匈牙利算法的更多相关文章

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

    一道网络有关的问题,还是一句话 网络流重在建模! 这里主要讲两种算法. 1.二分图匹配: 分析题意,我们可以知道题目要求是让所有留在学校的人都能有床睡 而 所有留在学校的人=本校不回家的人+外校的人: ...

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

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

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

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

  4. P2055 [ZJOI2009]假期的宿舍 题解(二分图)

    题目链接 P2055 [ZJOI2009]假期的宿舍 解题思路 因为懒,提供一种不连边,直接根据题目给出的邻接矩阵进行匈牙利算法的思路. \(a[i][j]\)表示\(i\)能不能睡\(j\)的床,需 ...

  5. 洛谷 P2055 [ZJOI2009]假期的宿舍

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

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

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

  7. 洛谷P2055 [ZJOI2009]假期的宿舍 [二分图最大匹配]

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

  8. P2055 [ZJOI2009]假期的宿舍

    思路 看到复杂的匹配条件,发现要让一个人和一个床匹配,所以就每个有床的人(指本校学生)和t连一条边,每个需要床的人(指外校的人和不回家的人)和s连一条边,i和j互相认识就把i和j的床连在一起,自己和自 ...

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

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

随机推荐

  1. PYTHON 爬虫笔记七:Selenium库基础用法

    知识点一:Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium ...

  2. ES6 Set数据结构

    Set ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. const s = new Set(); // const声明一个只读的常量.一旦声明,常量的值就不能 ...

  3. Mac系统存储-其他存储无故增大

    解决办法:打开Finder:安全倾倒废纸篓就会减少很大一部分存储.

  4. laravel基础课程---4、Laravel基础网站结构搭建

    laravel基础课程---4.Laravel基础网站结构搭建 一.总结 一句话总结: 1.搭建网站前后台路由:在路由组Route::group()中设置好命名空间和前缀 2.搭建控制器:比如1)新建 ...

  5. SSH中的Hibernate

    SSH中的Hibernate 就是DAO连接数据库对数据进行实际操作,做了架构简化,对数据库的操作.

  6. HBASE---shangxueT

  7. ACM学习历程—POJ1151 Atlantis(扫描线 && 线段树)

    Description There are several ancient Greek texts that contain descriptions of the fabled island Atl ...

  8. Mysql常用命令行大全(三)

    /**操作数据库*/ SHOW DATABASES; CREATE DATABASE db; SHOW DATABASES; DROP DATABASE db; /**操作表*/ USE  db; S ...

  9. docker 学习(一)什么是Docker

    项目中用到docker,就学习一下.第一篇是介绍. Sandboxie(沙箱):一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除.它创造了一个类似沙盒的独立作 ...

  10. win7 64位搭建Mantis 缺陷管理系统

    什么是Mantis MantisBT is a free popular web-based bugtracking system (feature list). It is written in t ...