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":"^_^");
        }
    }
    
  • 相关阅读:
    一个简单实现的遮罩层
    文字内容过长是自动出现省略号
    Maven入门学习(下)
    Maven入门学习(上)
    使用ODP.NET查询数据参数顺序问题及莫名ORA-01722错误提示
    Xamarin开发Android笔记:TextView行间距设定
    Xamarin开发Android笔记:图片切换ImageSwitcher
    Xamarin开发Android笔记:背景操作
    UI创意求助:手机贪吃蛇游戏方向控制键设计
    做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)
  • 原文地址:https://www.cnblogs.com/suika/p/8469657.html
Copyright © 2011-2022 走看看