[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;
}
posted @ 2018-10-05 10:58  Neworld1111  阅读(90)  评论(0编辑  收藏  举报