• 洛谷——P2055 [ZJOI2009]假期的宿舍


    P2055 [ZJOI2009]假期的宿舍

    学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题。比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识。我们假设每个人只能睡和自己直接认识的人的床。那么一个解决方案就是 B 睡 A 的床而 C 睡 B 的床。而实际情况可能非常复杂,有的人可能认识好多在校学生,在校学生之间也不一定都互相认识。我们已知一共有 n 个人,并且知道其中每个人是不是本校学生,也知道每个本校学生是否回家。问是否存在一个方案使得所有不回家的本校学生和来看他们的其他人都有地方住。

    显然的二分图匹配,这个图要分成两部分,一部分是人,另一部分是床

    建图:1.如果这个人在校且不回家,那么就连$i$到$i$一条边,表示这个人于这个床匹配

    2.如果这个人不在校且其朋友在校,就表明这个人可以睡在他朋友的床上,连接$i$到$j$

    注意初始化

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    
    #define N 260
    using namespace std;
    
    int head[N],tot;
    struct nodE{
        int to,next;
    }e[N];
    void add(int u,int v){
        e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
    }
    
    int n,dfn[N],match[N],ans,sum;
    int in[N],gh[N];
    
    void init(){
        memset(head,0,sizeof(head));
        memset(e,0,sizeof(e));
        memset(dfn,0,sizeof(dfn));
        memset(match,0,sizeof(match));
        tot=ans=sum=0;
    }
    
    bool dfs(int u,int t){
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].to;
            if(dfn[v]!=t){
                dfn[v]=t;
                if(!match[v]||dfs(match[v],t)){
                    match[v]=u;return true;
                }
            }
        }
        return false;
    }
    
    int t;
    int main()
    {
        scanf("%d",&t);
        while(t--){
            init();
            scanf("%d",&n);
            for(int i=1;i<=n;i++) scanf("%d",&in[i]);
            for(int i=1;i<=n;i++){
                scanf("%d",&gh[i]);
                if(!in[i]||(in[i]&&!gh[i])) ++sum;
                if(in[i]&&!gh[i]) add(i,i); 
            }
            for(int i=1;i<=n;i++){
                for(int x,j=1;j<=n;j++){
                    scanf("%d",&x);
                    if(x&&in[j]) add(i,j);
                }
            }
            for(int i=1;i<=n;i++)
                if((in[i]&&!gh[i])||!in[i]){
                    if(dfs(i,i)) ++ans;
                }
            
            if(ans==sum) printf("^_^
    ");
            else printf("T_T
    ");
        }
        
        return 0;
    }
  • 相关阅读:
    html调用php
    MySQL安装下载
    MySQL默认安装下载
    MySQL安装下载
    搭建php环境
    面试官:聊聊对Vue.js框架的理解
    TCP、UDP、HTTP、SOCKET之间的区别与联系
    HTTP/1、HTTP/2、HTTP/3
    git教程
    从jQuery到Serverless,前端十四年挖了多少坑?
  • 原文地址:https://www.cnblogs.com/song-/p/9810587.html
Copyright © 2020-2023  润新知