zoukankan      html  css  js  c++  java
  • BZOJ1433_假期的宿舍_KEY

    题目传送门

    二分图匹配的题目。

    但建边有一定难度,关系比较复杂。

    首先要统计总共需要几张床。

    在校且住校的会需要一张床,不住校的需要一张床。

    然后对于在校且住校的与自己的床连边,不住校的与认识的住校的人连一条边。

    跑一遍匈牙利就好了。

    code:

    /**************************************************************
        Problem: 1433
        User: yekehe
        Language: C++
        Result: Accepted
        Time:28 ms
        Memory:824 kb
    ****************************************************************/
     
    #include <cstdio>
    #include <vector>
    #include <cstring>
    using namespace std;
     
    int read()
    {
        char c;while(c=getchar(),c<'0'||c>'9');
        int x=c-'0';while(c=getchar(),c>='0'&&c<='9')x=x*10+c-'0';
        return x;
    }
     
    int T,N,o,cnt,ans;
    int k[55],w[55];
    vector<int>a[55];
     
    int vis[55],last[55],now;
    bool find(int x)
    {
        for(int i=0;i<a[x].size();i++){
            int to=a[x][i];
            if(vis[to]!=now){
                vis[to]=now;
                if(!last[to] || find(last[to])){
                    last[to]=x;
                    return true;
                }
            }
        }
        return false;
    }
     
    int main()
    {
        T=read();
        register int i,j;
            while(T--){
                ans=cnt=0;
                N=read();
                memset(last,0,sizeof last);
                memset(a,0,sizeof a);
                    for(i=1;i<=N;i++)k[i]=read();
                    for(i=1;i<=N;i++)w[i]=read();
                    for(i=1;i<=N;i++){
                        if(!k[i])cnt++;
                        else {
                            if(!w[i])cnt++,a[i].push_back(i);
                        }//建边且统计床的数量
                    }
                    for(i=1;i<=N;i++)
                        for(j=1;j<=N;j++){
                            o=read();
                            if(!o)continue;
                            if(k[j])a[i].push_back(j);//建边
                        }
                    for(i=1;i<=N;i++)
                        if(!k[i]||!w[i])now++,ans+=find(i);//二分图匹配
                puts(ans==cnt?"^_^":"T_T");
            }
        return 0;
    }
  • 相关阅读:
    基础_String
    tomcat缓存
    jquery绑定事件
    Java面试之基础题---对象Object
    Java设计模式学习三-----工厂模式
    网络基础学习---各种概念
    Java设计模式学习二
    Hibernate框架的主键生成策略
    Hibernate的Session的get()和load()方法区别
    Hibernate 框架理解
  • 原文地址:https://www.cnblogs.com/Cptraser/p/8446586.html
Copyright © 2011-2022 走看看