标签:register hungary hung false link 匹配 rap std ems
所有学生都有床可以让认识自己的人睡,不在校的学生不占用床铺。
考虑建一个二分图,人对应床,求出最大匹配,根据题意,所有人都应该被安排上,那么就不能存在无法匹配。
#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;
}
标签:register hungary hung false link 匹配 rap std ems
原文地址:https://www.cnblogs.com/Neworld2002/p/9744372.html