洛谷 p2055 假期的宿舍 题解
好长时间没更博客了
因为实在太蒻了

这让本蒟蒻怎么办
今天终于遇到了一道模板题(之前也有,不过太蒻了都不会)
不过...写代码5分钟,调试2小时
分界线:回归正题
这个就是普通的匈牙利算法 差不多
思路:
我们需要统计出谁需要床,谁有床
我们的二分图就是 需要的人 和 床
跑匈牙利就好了
什么人不需要床?? 在校且回家的人
什么床能用?? 在校的人
由于人的序号和床的序号会重复
所以我在床的序号上加了m,(比如一共有3个人,一号床的"名字"就是4)
如果还不明白上面那句那就可以理解为#define 一号床 4
由于题目要求输入是邻接矩阵,所以我们可以只读入一半(左上角和右下角连线以左不读)
因为人的信任是相互的
对应好之后就可以了
做这道题,怎么做?
1 : 学会匈牙利算法,不管你用Google.Baidu.360.搜狗.bing.yandex......什么引擎(能用就行)
都有很生动的例子,这里不再赘述
2 : 学会图论基本知识,会用邻接表存边(只会邻接矩阵的话可以先学一学或者看懂我的之后自己写)
3 : 写代码,就是用你的小爪爪摸一下键盘
4 : debug,dalao自行跳过
5 : 最重要的一步:
打上神兽!!!!
┌─┐ ┌─┐
┌─┘ ┴────┘ ┴─┐
│ │
│ ─── │
│ ─┬┘ └┬─ │
│ │
│ ─┴─ │
│ │
└──┐ ┌──┘
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ └──────────┐
│ │
│ ├─┐
│ ┌─┘
│ │
└─┐ ┐ ┌────┬ ┐ ┌──┘
│─┤─┤ │─┤─┤
└─┴─┘ └─┴─┘
神兽保佑
代码无BUG!
看起来好像不大对,但是粘贴到记事本或sublime(Dev也行)
就会变成非常帅气的样子
现在贴代码
#include<bits/stdc++.h>
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
inline void write(int x) {if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); }
int u[10001],v[10001],f[10001],N[10001],g[10001];
bool bj[10001],bj2[10001],book[10001];
void add(int x,int y,int z){//邻接表存边
u[z] = x; v[z] = y;
N[z] = f[x]; f[x] = z;
}
bool find(int x){//匈牙利模板
for(int i = f[x];i != -1;i = N[i]){
int p = v[i];
if(!book[p]){
book[p] = 1;
if(g[p] == 0 || find(g[p])){
g[p] = x;
return 1;
}
}
}
return 0;
}
int main(int argc, char const *argv[])
{
int yy;
yy = read();
while(yy){
int tt = 0;
yy--;
memset(f,-1,sizeof f);//多测不清空,爆零两行泪
memset(u,0,sizeof u);
memset(v,0,sizeof v);
memset(g,0,sizeof g);
memset(bj,0,sizeof bj);
memset(bj2,0,sizeof bj2);
int m,x,tot = 0;
m = read();
for(int i = 1;i <= m;++i) bj[i] = read();//在校标记
for(int i = 1;i <= m;++i) {
x = read();
bj2[i] = x;//是否回家的标记
if(!bj[i]) bj2[i] = 0;//不在校就可以当不回家处理(因为需要床)
if(bj2[i]) tt++;
}
for(int i = 1;i <= m;++i){
for(int j = 1;j <= m;++j){
x = read();
if(i > j) continue;//只读一半
if(i == j && bj[i])//自己可以睡自己的床
x = 1;
if(x == 0) continue;//不能互相睡床不存边
if(bj[j] && !bj2[i]){//j有床i不回家就加边
// cout<<i<<" "<<j<<endl;
add(i,m + j,++tot);
}
if(i == j) continue;
if(bj[i] && !bj2[j]){//同理
// cout<<j<<" "<<i<<endl;
add(j,m + i,++tot);
}
}
}
// for(int i = 1;i <= m;++i){
// cout<<f[i]<<" "<<N[i]<<endl;
// }
int cnt = 0;
for(int i = 1;i <= m;++i){
memset(book,0,sizeof book);
if(find(i)) cnt++;
}
if(cnt == m - tt) cout<<"^_^"<<"\n";
else cout<<"T_T"<<"\n";
}
return 0;
}
/***
* ┌─┐ ┌─┐
* ┌─┘ ┴────┘ ┴─┐
* │ │
* │ ─── │
* │ ─┬┘ └┬─ │
* │ │
* │ ─┴─ │
* │ │
* └──┐ ┌──┘
* │ │
* │ │
* │ │
* │ │
* │ │
* │ │
* │ │
* │ └──────────┐
* │ │
* │ ├─┐
* │ ┌─┘
* │ │
* └─┐ ┐ ┌────┬ ┐ ┌──┘
* │─┤─┤ │─┤─┤
* └─┴─┘ └─┴─┘
* 神兽保佑
* 代码无BUG!
*/
洛谷 p2055 假期的宿舍 题解的更多相关文章
- 【二分图】洛谷P2055假期的宿舍
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识. ...
- 洛谷 - P2055 - 假期的宿舍 - 最大流
https://www.luogu.org/problemnew/show/P2055 这是一个错误的示范. 一开始觉得就找一条路从外校同学连到本校同学然后最终从周末回家的同学流出,每个人睡后一个人的 ...
- 洛谷P2055假期的宿舍
题目 此题主要是考察二分图匹配,而二分图匹配最主要的就是建图,而图一般都是要分成两个部分来分,比如该题就需要先将在学校住的人和床连在一起,因为在学校住就会与一个床.然后每两个人之间假如他们相互认识就可 ...
- 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码
洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...
- 洛谷 P2055 [ZJOI2009]假期的宿舍
洛谷 P2055 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- 洛谷 P2055 【假期的宿舍】
题库 :洛谷 题号 :2055 题目 :假期的宿舍 link :https://www.luogu.org/problem/P2055 首先明确一下:校内的每个学生都有一张床(只是校内的有) 思路 : ...
随机推荐
- mybatis使用associaton进行分步查询
Employee类 public class Employee { private Integer id; private String lastName; private String email; ...
- @Bean修饰的方法参数的注入方式
@Bean修饰的方法参数的注入方式: 方法参数默认注入方式为Autowired,即先根据类型匹配,若有多个在根据名称进行匹配. 1:复杂类型可以通过@Qualifier(value=“XXX”)限定; ...
- Logstash跟es加密通信
前提条件,es集群内部各节点已开启https访问,集群也已开启x-pack安全功能,并设置了系统默认的用户密码等,具体操作详见:https://www.cnblogs.com/sanduzxcvbnm ...
- 2019-11-29-WPF-高性能笔
原文:2019-11-29-WPF-高性能笔 title author date CreateTime categories WPF 高性能笔 lindexi 2019-11-29 10:20:51 ...
- 一次U9身份验证http数据对接
一般情况下传输和回传HTTP协议就搞定了,但这次不同,有身份验证,网上的资料相对较少,怎么办呢?.NET没有不代表JAVA没有,网上搜JAVA身份验证HTTP协议, 果然是有的,跟着代码改成相应的.N ...
- vb Replace 实现
今天改一个VB程序时发现程序自带的replace 函数不知什么原因竟然不好用了 所以就自己写了一个玩玩 记录一下 'XGZ '替换字符 Private Function Replace1(ByVal ...
- 01 .NET CORE 2.2 使用OCELOT -- 简单使用
目前参考两篇文章,已实现基本的ocelot的网关功能. https://www.cnblogs.com/xlxr45/p/11320988.html https://www.jianshu.com/p ...
- JavaScript学习思维导图
JS基本概念 JS操作符 JS基本语法 JS数组 JS Date用法 JS 字符串用法 JS编程风格 JS实践
- Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
目录 Redis之缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级 1.缓存雪崩 2.缓存穿透 3.缓存预热 4.缓存更新 5.缓存降级 Redis之缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级 ...
- SpringBoot源码解析:创建SpringApplication对象实例
上篇文章SpringBoot自动装配原理解析中,我们分析了SpringBoot的自动装配原理以及@SpringBootApplication注解的原理,本篇文章则继续基于上篇文章中的main方法来分析 ...