• 洛谷——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;
    }
  • 相关阅读:
    Appium 走过的坑( Mac+java )--Apple 篇
    不用第三个变量,互换两个变量的值
    PHPUnit 整合 Selenium2 + PhantomJS
    搜索网站的多线程爬虫
    递归地删除目录
    SQL数据库字段添加说明文字
    SQL Server中数据去重单列数据合并
    SQL Server创建链接服务器
    VS2017快捷键
    由于出现以下异常,无法生成模型:“System.Data.StrongTypingException: 表“TableDetails”中列“IsPrimaryKey”的值为 DBNull
  • 原文地址:https://www.cnblogs.com/song-/p/9810587.html
Copyright © 2020-2023  润新知