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

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

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

  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. ARP之windows下的ARP命令

    ARP之windows下的ARP命令 arp -a 查看当前电脑上的ARP映射表.可以看到当前的ARP的映射关系是动态的还是静态的. arp -s w.x.y.z aa-bb-cc-dd-ee-ff ...

  2. BZOJ 1193 [HNOI2006]马步距离:大范围贪心 小范围暴搜

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1193 题意: 给定起点(px,py).终点(sx,sy).(x,y < 100000 ...

  3. html的head中的常见元素

    <head></head>中有charset, title,link 操作系统默认的字符编码就是gbk. html的加强 (1)<a href="#" ...

  4. array_1.array_map

    note: 为数组的每个元素应用回调函数 <?php $arr = [1, 2, 3]; $arr1 = array_map( function ($value) { return $value ...

  5. OpenCv-Python 图像处理基本操作

    1. 图片加载.显示和保存 import cv2 img = cv2.imread("01.jpg") imgGrey = cv2.imread("01.jpg" ...

  6. 远程调用appium server

    例如:我有两台电脑A(192.168.112.10)和B(192.168.112.11),那我怎么能在A执行本地脚本,但是使用B上的server呢?   查看appium连接appium服务并开启一个 ...

  7. WPF 使用MultiBinding ,TwoWay ,ValidationRule ,需要注意的事项

    当wpf使用multibinding时, 其内部的validaterule的value 是其多个Binding的值, 要根据情况去验证, 还有就是在做IMultiConverter的ConvertBa ...

  8. POJ1502(最短路入门题)

    MPI Maelstrom Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7471   Accepted: 4550 Des ...

  9. shuts down an ExecutorService

    shuts down an ExecutorService in two phases, first by calling shutdown to reject incoming tasks, and ...

  10. 用fpm模式在虚拟主机上安装phpmyadmin

    实验环境:CentOS7 1.配置虚拟主机 [root@conf.d localhost]#vi /etc/httpd/conf.d/vhost.conf #配置在/etc/httpd/conf.d下 ...