首页 > 其他 > 详细

P2055-[ZJOI2009]假期的宿舍

时间:2019-09-18 18:28:05      阅读:104      评论:0      收藏:0      [点我收藏+]
  1 #include <bits/stdc++.h>
  2 #define _for(i,a,b) for(int i = (a);i < b;i ++)
  3 #define _rep(i,a,b) for(int i = (a);i > b;i --)
  4 #define maxn 139*2
  5 #define INF 0x3f3f3f3f
  6 #define MOD 1000000007
  7 typedef long long ll;
  8 using namespace std;
  9 inline ll read()
 10 {
 11     ll ans = 0;
 12     char ch = getchar(), last =  ;
 13     while(!isdigit(ch)) last = ch, ch = getchar();
 14     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - 0, ch = getchar();
 15     if(last == -) ans = -ans;
 16     return ans;
 17 }
 18 inline void write(ll x)
 19 {
 20     if(x < 0) x = -x, putchar(-);
 21     if(x >= 10) write(x / 10);
 22     putchar(x % 10 + 0);
 23 }
 24 int n;
 25 int isST[maxn],goHM[maxn];
 26 int beFM[maxn][maxn];
 27 int a[maxn][maxn];
 28 bool used[maxn];
 29 void get()
 30 {
 31     n = read();
 32     memset(isST,0,sizeof(isST));
 33     memset(goHM,0,sizeof(goHM));
 34     memset(beFM,0,sizeof(beFM));
 35     memset(a,0,sizeof(a));
 36     _for(i,0,n)
 37         isST[i] = read();
 38     _for(i,0,n)
 39     {
 40         int a = read();
 41         if(!isST[i])
 42             continue;
 43         goHM[i] = a;
 44     }
 45     _for(i,0,n)
 46     _for(j,0,n)
 47     beFM[i][j] = read();
 48 }
 49 int linker[maxn];
 50 int cnt = 0;
 51 bool dfs(int u)
 52 {
 53     _for(v,0,n)
 54         if(isST[v] && a[u][v] && !used[v])
 55         {
 56             used[v] = true;
 57             if(linker[v] == -1 || dfs(linker[v]))
 58             {
 59                 linker[v] = u;
 60                 return true;
 61             }
 62         }
 63     return false;
 64 }
 65 int hungry()
 66 {
 67     int res = 0;
 68     memset(linker,-1,sizeof(linker));
 69     _for(u,0,n)
 70     {
 71         memset(used,false,sizeof(used));
 72         if((!isST[u] || (isST[u]&&!goHM[u])) && dfs(u))
 73             res    ++;
 74     }
 75     return res;
 76 }
 77 int main()
 78 {
 79     int T;
 80     T = read();
 81     while(T--)
 82     {
 83         get();
 84         cnt = 0;
 85         _for(i,0,n)
 86         if(!isST[i] || (isST[i]&&!goHM[i]))
 87             cnt ++;
 88         _for(i,0,n)
 89         {
 90             if(isST[i] && !goHM[i])
 91                 a[i][i] = 1;
 92             _for(j,0,n)
 93             if(beFM[i][j] && isST[j])
 94                 a[i][j] = 1;
 95         }
 96         if(hungry()==cnt)
 97             printf("^_^\n");
 98         else
 99             printf("T_T\n");
100     }
101     return 0;
102 }

 

P2055-[ZJOI2009]假期的宿舍

原文:https://www.cnblogs.com/Asurudo/p/11544198.html

(2)
(2)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!