zoukankan      html  css  js  c++  java
  • BZOJ_1433_[ZJOI2009]假期的宿舍_二分图匹配

    BZOJ_1433_[ZJOI2009]假期的宿舍_二分图匹配

    题意:

    学校放假了······有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题。比如A和B都是学校的学生,A要回家,而C来看B,C与A不认识。我们假设每个人只能睡和自己直接认识的人的床。那么一个解决方案就是B睡A的床而C睡B的床。而实际情况可能非常复杂,有的人可能认识好多在校学生,在校学生之间也不一定都互相认识。我们已知一共有n个人,并且知道其中每个人是不是本校学生,也知道每个本校学生是否回家。问是否存在一个方案使得所有不回家的本校学生和来看他们的其他人都有地方住。
     
    分析:
    把人和床当成点,每个人向认识的人的床连边,求二分图最大匹配。
     
     
    代码:
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define N 200
    int head[N],to[N*N<<1],nxt[N*N<<1],match[N],vis[N];
    int T,n,is[N],in[N],cnt;
    inline void add(int u,int v){
        to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
    }
    bool dfs(int x){
        for(int i=head[x];i;i=nxt[i]){
            if(!vis[to[i]]){
                vis[to[i]]=1;
                if(!match[to[i]]||dfs(match[to[i]])){
                    match[to[i]]=x;return 1;
                }
            }
        }
        return 0;
    }
    int main(){
        scanf("%d",&T);
        while(T--){
            cnt=0;memset(head,0,sizeof(head));
            memset(match,0,sizeof(match));
            scanf("%d",&n);
            int sum=0;
            for(int i=1;i<=n;i++){
                scanf("%d",&is[i]);
                if(is[i]==0)sum++;
            }
            for(int i=1;i<=n;i++){
                scanf("%d",&in[i]);
                if(is[i]&&in[i]==0)sum++,add(i,i+n),add(i+n,i);
            }
            int x;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    scanf("%d",&x);
                    if(x&&is[j])add(i,j+n),add(j+n,i);
                }	
            }
            for(int i=1;i<=n;i++){
                if(is[i]==0||(is[i]&&in[i]==0)){
                    memset(vis,0,sizeof(vis));
                    if(dfs(i))sum--;
                }
            }
            puts(sum?"T_T":"^_^");
        }
    }
    
  • 相关阅读:
    代码阅读之术一:结构与源流
    linux cat /etc/passwd 说明
    Linux软连接
    文件上传文件的权限--lnmp 环境配置,尤其整个项目复制过来
    Redis面试总结
    php上传文件与图片到七牛的实例详解
    在浏览器中打开php文件时,是Linux中的哪个用户执行的?
    Laravel [1045] 解决方法 Access denied for user 'homestead'@'localhost'
    linux中快速清空文件内容的几种方法
    linux如何查看所有的用户和组信息?
  • 原文地址:https://www.cnblogs.com/suika/p/8469657.html
Copyright © 2011-2022 走看看