码迷,mamicode.com
首页 > 其他好文 > 详细

[luogu2055] [ZJOI2009]假期的宿舍

时间:2018-10-05 12:18:15      阅读:180      评论:0      收藏:0      [点我收藏+]

标签: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;
}

[luogu2055] [ZJOI2009]假期的宿舍

标签:register   hungary   hung   false   link   匹配   rap   std   ems   

原文地址:https://www.cnblogs.com/Neworld2002/p/9744372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!