LuoguP2055 [ZJOI2009]假期的宿舍【二分图最大匹配】By cellur925
这道题开始感觉不出是二分图最大匹配的qwq。但是今天学了匈牙利算法,想来做几个题qwq。做这个题的时候想了很久它哪里是二分图,脑子里是“两列,每列有很多点的那种图 qwq。”
然后看了题解,发现竟是这样简单qwq。
关键还在建图。
首先把本校且不回家的学生自己向自己连一条边,之后再把和自己认识的还是本校的学生连一条边(不用管他回不回家),之后跑一遍最大匹配就成了。
回顾一下我们发现,它确实满足“任意两条边没有公共端点”的性质,因为我们暂时排除了基♂的情况,不会有两个人睡在一张床上。
然后注意在主程序中跑匹配的时候,不是每个点都跑,而是那些有住宿需求的人跑。(为此WA了两次qwq)
Code
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; int T,n,sta,ans,tot;
int stu[],head[],home[],match[];
bool vis[];
struct node{
int to,next;
}edge[]; void add(int x,int y)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} bool dfs(int x)
{
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(!vis[y])
{
vis[y]=;
if(!match[y]||dfs(match[y]))
{
match[y]=x;
return ;
}
}
}
return ;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&stu[i]);
for(int i=;i<=n;i++)
{
if(stu[i]) scanf("%d",&home[i]);
else scanf("%d",&home[]);
if(!home[i]&&stu[i]) add(i,i);
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
int x=;
scanf("%d",&x);
if(x&&stu[j]) add(i,j);
}
for(int i=;i<=n;i++)
if(!stu[i]||(!home[i]&&stu[i])) sta++;
for(int i=;i<=n;i++)
if(!stu[i]||(!home[i]&&stu[i]))
{
memset(vis,,sizeof(vis));
if(dfs(i)) ans++;
}
if(ans==sta) printf("^_^\n");
else printf("T_T\n");
memset(match,,sizeof(match));
memset(head,,sizeof(head));
sta=,ans=,tot=;
}
return ;
}
LuoguP2055 [ZJOI2009]假期的宿舍【二分图最大匹配】By cellur925的更多相关文章
- BZOJ1433[ZJOI2009]假期的宿舍——二分图最大匹配
题目描述 学校放假了······有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如A 和B都是学校的学生,A要回家,而C来看B,C与A不认识.我们假设每个人只能睡和自己直接认 ...
- 洛谷P2055 [ZJOI2009]假期的宿舍 [二分图最大匹配]
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识. ...
- [ZJOI2009]假期的宿舍 二分图匹配匈牙利
[ZJOI2009]假期的宿舍 二分图匹配匈牙利 一个人对应一张床,每个人对床可能不止一种选择,可以猜出是二分图匹配. 床只能由本校的学生提供,而需要床的有住校并且本校和外校两种人.最后统计二分图匹配 ...
- BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2375 Solved: 1005[Submit][Sta ...
- bzoj1433: [ZJOI2009]假期的宿舍 [二分图][二分图最大匹配]
Description Input Output Sample Input 1 3 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 Sample Output ˆ ˆ HINT 对于30% ...
- P2055 [ZJOI2009]假期的宿舍[二分图匹配]
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题. 比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识 ...
- BZOJ1433 [ZJOI2009]假期的宿舍 二分图匹配 匈牙利算法
原文链接http://www.cnblogs.com/zhouzhendong/p/8372785.html 题目传送门 - BZOJ1433 题解 我们理一理题目. 在校的学生,有自己的床,还可以睡 ...
- [bzoj1433][ZJOI2009]假期的宿舍——二分图
题目大意 传送门 题解 显然是二分图匹配. 用一些方法建图就好了. 要注意的是: 本题有多组数据!!! 初始化一定要注意!!! 代码 #include <bits/stdc++.h> us ...
- 洛谷 2055 [ZJOI2009]假期的宿舍——二分图匹配
题目:https://www.luogu.org/problemnew/show/P2055 #include<iostream> #include<cstdio> #incl ...
随机推荐
- iOS开发核心语言Objective C —— 全部知识点总结
本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基 ...
- HDU 3342 Legal or Not (最短路 拓扑排序?)
Legal or Not Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- dom get selector
function realsQuery(element) { if(!element){ return ""; } var currentQuery=""; i ...
- Python开发【第6节】【文件操作】
1.基本文件操作 open() 打开或者创建一个文件 格式:open('文件路径','打开模式') 返回值:文件io对象 打开模式一共N种: w模式 写模式write 文件不存在时会创建文件,如果文件 ...
- 浅谈JavaScript的事件(事件流)
事件流描述的是从页面中接收事件的顺序.IE的事件流失事件冒泡,而Netspace的事件流失事件捕获. 事件冒泡 IE的事件流叫事件冒泡,即事件开始时,由具体的元素(文档中嵌套层次最深的节点)接收,然 ...
- MongoDB安装和简单介绍
前面我们把nodejs的web开发入门说了,如今来说说数据库,一般搭配的数据库是mysql和mongodb,今天我们来说mongodb MongoDB是一个基于分布式文件存储的数据库,由C++语言编写 ...
- 初识跨终端Web
近期试读了<跨终端Web>这本书的部分章节,既为了拿到书,也为了记录下读后的收获的东西,这会是个非常好的习惯吧. 标题为"初识跨终端Web".对我来说最贴切了,在此之前 ...
- jvm 命令
jps jps主要用来输出JVM中运行的进程状态信息.语法格式如下: jps [options] [hostid] 如果不指定hostid就默认为当前主机或服务器. -q 不输出类名.Jar名和传入 ...
- Java-JDK-bin-Java-JR
Java in JDK\bin vs. Java in JRE\bin (Java in General forum at Coderanch) https://coderanch.com/t/385 ...
- linux子系统的初始化_subsys_initcall()
http://my.oschina.net/u/572632/blog/305492#OSC_h1_3