洛谷 P2055 [ZJOI2009]假期的宿舍 题解

原创 2018年04月17日 13:36:32

题目大意:

算了太长了还是不讲了吧,想看题的戳这里

对于这道题,我们可以用网络流做(不懂网络流的戳这里),1~n记录需要床的人,与原点连一条边,n+1~2*n记录每个学生的床,与汇点连一条边,然后跑一次最大流,原点拥有的流量为需要床的人的数量,假如全部流量都可以流到汇点,说明存在可行方案,思路就是这么简单,上代码吧:

#include <cstdio>
#include <cstring>

int n,m,t,len;
struct node{int x,y,z,next;};
node e[10010];
int first[110];
bool a[110],b[110];
int tou,wei;
void buildroad(int x,int y,int z)
{
    len++;
    e[len].x=x;
    e[len].y=y;
    e[len].z=z;
    e[len].next=first[x];
    first[x]=len;
}
int h[110],q[110],st,ed;
bool bfs()
{
    memset(h,0,sizeof(h));
    st=1,ed=2;
    q[st]=tou;
    h[tou]=1;
    while(st!=ed)
    {
        int x=q[st];
        for(int i=first[x];i;i=e[i].next)
        {
            int y=e[i].y;
            if(h[y]==0&&e[i].z>0)
            {
                h[y]=h[x]+1;
                q[ed++]=y;
            }
        }
        st++;
    }
    if(h[wei]==0)return false;
    else return true;
}
int minn(int x,int y){return x<y?x:y;}
int dfs(int x,int z)
{
    if(x==wei)return z;
    int tt=0;
    for(int i=first[x];i;i=e[i].next)
    {
        int y=e[i].y;
        if(z-tt<=0)
            break;
        if(h[y]==h[x]+1&&e[i].z>0)
        {
            int my=dfs(y,minn(z-tt,e[i].z));
            tt+=my;
            e[i].z-=my;
            e[(i^1)].z+=my;//这种反向边的表示方式我在写网络流的那篇博客中有讲,不明白的可以去看看 
        }
    }
    if(tt==0)h[x]=0;
    return tt;
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            if(x)a[i]=true;
            else a[i]=false;
        }
        for(int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            if(x)b[i]=true;
            else b[i]=false;
        }
        int m=n;//记录需要床的人数 
        memset(first,0,sizeof(first));len=1;//记得初始化 
        tou=2*n+1,wei=tou+1;
        for(int i=1;i<=n;i++)
        {
            if(a[i]&&b[i])m--;//假如有在校学生回家那么需要床的人-1,其他的都是要床的 
            if(a[i]&&!b[i])buildroad(i,i+n,1),buildroad(i+n,i,0);//假如在校学生不回家,那么他是可以睡自己的床的 
            if((a[i]&&!b[i])||!a[i])buildroad(tou,i,1),buildroad(i,tou,0);//假如这是个不回家的在校学生或者是外人,说明他需要床,于是与原点连一条边 
            if(a[i])buildroad(i+n,wei,1),buildroad(wei,i+n,0);//如果这个人是在校学生,说明他有床,把他的床和汇点连一条边 
            for(int j=1;j<=n;j++)
            {
                int x;
                scanf("%d",&x);
                if(x)//如果i和j认识 
                {
                    if(a[i]&&(!a[j]||(a[j]&&!b[j])))buildroad(j,i+n,1),buildroad(i+n,j,0);//如果i有床并且j需要床 
                    if(a[j]&&(!a[i]||(a[i]&&!b[i])))buildroad(i,j+n,1),buildroad(j+n,i,0);//同上 
                }
            }
        }
        int ans=0;
        while(bfs())ans+=dfs(tou,m);//标准网络流 
        if(ans!=m)printf("T_T\n");
        else printf("^_^\n");
    }
}


【BZOJ 1433】 [ZJOI2009]假期的宿舍

二分图求最大匹配~
  • Regina8023
  • Regina8023
  • 2015-03-09 19:42:50
  • 930

洛谷 P2055 [ZJOI2009]假期的宿舍

匈牙利算法
  • chai_jing
  • chai_jing
  • 2016-11-10 19:15:24
  • 269

bzoj1433[ZJOI2009]假期的宿舍

Description Input Output Sample Input 1 3 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 Sam...
  • zhb1997
  • zhb1997
  • 2014-06-13 22:32:01
  • 706

【bzoj1433】[ZJOI2009]假期的宿舍 二分图匹配

总之,按照要求连边就对了。裸的最大匹配。 #include #include #include #include #include #include #define maxn 110 us...
  • u012288458
  • u012288458
  • 2016-02-16 11:00:31
  • 720

二分图 洛谷P2055 [ZJOI2009]假期的宿舍

[ZJOI2009]假期的宿舍 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题。比如 A 和 B 都是学校的学生,A 要回家,而 ...
  • sdfzwzac
  • sdfzwzac
  • 2017-07-10 01:05:18
  • 46

洛谷P2055 [ZJOI2009]假期的宿舍

题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题。比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识...
  • yangrui2002
  • yangrui2002
  • 2017-10-30 17:31:33
  • 99

二分图——洛谷P2055 [ZJOI2009]假期的宿舍

https://www.luogu.org/problem/show?pid=2055 简单模型就是要睡觉的人连接可以睡觉的床; 然后大力匈牙利#include using namespace s...
  • largecub233
  • largecub233
  • 2017-05-23 20:14:33
  • 140

洛谷 P2055 [ZJOI2009] 假期的宿舍

匈牙利算法+思路
  • SenyeLicone
  • SenyeLicone
  • 2016-11-14 15:56:31
  • 280

[洛谷P2055]假期的宿舍

题目←存一波匈牙利板子 check数组还是老老实实for一遍更新吧,回溯的时候更新容易出事//:-) #include #include #include #include #define LL l...
  • LOI_pingxing
  • LOI_pingxing
  • 2017-11-06 20:59:11
  • 58

洛谷 P2055 假期的宿舍

洛谷 P2055 [ZJOI2009]假期的宿舍题目题目描述学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题。比如 A 和 B 都是学校的学生...
  • faojie
  • faojie
  • 2017-06-09 21:00:33
  • 165
收藏助手
不良信息举报
您举报文章:洛谷 P2055 [ZJOI2009]假期的宿舍 题解
举报原因:
原因补充:

(最多只允许输入30个字)