码迷,mamicode.com
首页 > 其他好文 > 详细

[ZJOI2009]假期的宿舍

时间:2017-05-27 23:05:33      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:out   blog   eof   bsp   return   com   div   ring   inpu   

1433: [ZJOI2009]假期的宿舍

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2870  Solved: 1213
[Submit][Status][Discuss]

Description

技术分享

Input

技术分享

Output

技术分享

Sample Input

1
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0

Sample Output

ˆ ˆ

HINT

对于30% 的数据满足1 ≤ n ≤ 12。
对于100% 的数据满足1 ≤ n ≤ 50,1 ≤ T ≤ 20。

 

左边:在校的不回家的,和不在校的

右边:在校的人的床

最大匹配

#include<cstdio>
#include<cstring>
#define N 51
using namespace std;
int T,n,ans,sum;
bool in[N],home[N],know[N][N],live[N][N];
bool v[N];
int match[N];
bool go(int u)
{
    for(int i=1;i<=n;i++)
     if(in[i]&&live[u][i]&&!v[i])
     {
         v[i]=true;
         if(!match[i]||go(match[i]))
         {
             match[i]=u;
             return 1;
        }
     }
    return 0;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        ans=sum=0;
        memset(live,0,sizeof(live));
        memset(match,0,sizeof(match));
        for(int i=1;i<=n;i++)  scanf("%d",&in[i]);
        for(int i=1;i<=n;i++) scanf("%d",&home[i]);
        for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
          scanf("%d",&know[i][j]);
        for(int i=1;i<=n;i++)
        {
            //if(!in[i]||home[i]) continue;
            if(in[i]&&home[i]) continue;
            sum++;
            for(int j=1;j<=n;j++)
             live[i][j]=know[i][j];
            live[i][i]=1;
        }
        for(int i=1;i<=n;i++)
        {
            if(in[i]&&home[i]) continue;
            memset(v,0,sizeof(v));
            if(go(i)) ans++;
        }
        if(ans==sum) puts("^_^");
        else puts("T_T");
    }
}

 

[ZJOI2009]假期的宿舍

标签:out   blog   eof   bsp   return   com   div   ring   inpu   

原文地址:http://www.cnblogs.com/TheRoadToTheGold/p/6914582.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!