[luogu2055] [ZJOI2009]假期的宿舍
Posted neworld2002
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[luogu2055] [ZJOI2009]假期的宿舍相关的知识,希望对你有一定的参考价值。
所有学生都有床可以让认识自己的人睡,不在校的学生不占用床铺。
考虑建一个二分图,人对应床,求出最大匹配,根据题意,所有人都应该被安排上,那么就不能存在无法匹配。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 55
int Link[MAXN],vis[MAXN];
int Graph[MAXN][MAXN];
int is_out[MAXN],is_s[MAXN];
int T,N;
bool Hungary(int u){
for(register int i=1;i<=N;++i){
if(is_s[i]==0||vis[i]==1)continue;
if(Graph[u][i]==0)continue;
vis[i] = 1;
if(Link[i]==0||Hungary(Link[i])){
Link[i] = u;
return true;
}
}
return false;
}
int main(){
scanf("%d",&T);
for(register int k=1;k<=T;++k){
std::memset(Link,0,sizeof(Link));
scanf("%d",&N);
for(register int i=1;i<=N;++i)scanf("%d",&is_s[i]);
for(register int i=1;i<=N;++i)scanf("%d",&is_out[i]);
for(register int i=1;i<=N;++i)
for(register int j=1;j<=N;++j)scanf("%d",&Graph[i][j]);
for(register int i=1;i<=N;++i)Graph[i][i] = 1;
bool flag = true;
for(register int i=1;i<=N;++i){
if(is_s[i]==1&&is_out[i]==1)continue;
std::memset(vis,0,sizeof(vis));
if(!Hungary(i)){
flag = false;
break;
}
}
if(flag)puts("^_^");
else puts("T_T");
}
return 0;
}
以上是关于[luogu2055] [ZJOI2009]假期的宿舍的主要内容,如果未能解决你的问题,请参考以下文章
P2055 [ZJOI2009]假期的宿舍(二分图&最大流)