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

    题意:给你一些人可以睡某某人的床,问是否有所有人都睡下的方案?n<=50。

    二分图最大匹配。

    用邻接矩阵比较舒服。

    标程:

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int read()
     5 {
     6     int x=0;char ch=getchar();
     7     while (ch<'0'||ch>'9') ch=getchar();
     8     while ('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
     9     return x;
    10 }
    11 const int N=55;
    12 int vis[N],tot,ans,n,st[N],gh[N],match[N],x,g[N][N];
    13 int find(int x)
    14 {
    15     for (int i=1;i<=n;i++)
    16       if (!vis[i]&&g[x][i])
    17       {
    18            vis[i]=1;
    19            if (!match[i]||find(match[i])) {match[i]=x;return 1;}
    20       }
    21     return 0;
    22 }
    23 int main()
    24 {
    25     int T=read();
    26     while (T--)
    27     {
    28        n=read();tot=0;memset(g,0,sizeof(g));
    29        for (int i=1;i<=n;i++) st[i]=read();
    30        for (int i=1;i<=n;i++) gh[i]=read();
    31        for (int i=1;i<=n;i++) if (st[i]&&!gh[i]) g[i][i]=1;
    32        for (int i=1;i<=n;i++) if (st[i]&&!gh[i]||!st[i]) tot++;
    33        for (int i=1;i<=n;i++)
    34           for (int j=1;j<=n;j++)
    35             if (read())
    36                 if (!(st[i]&&gh[i])&&st[j]) g[i][j]=1;
    37        memset(match,0,sizeof(match));ans=0;
    38        for (int i=1;i<=n;i++)
    39        {
    40              memset(vis,0,sizeof(vis));
    41              if (find(i)) ans++;
    42        }
    43        puts(tot==ans?"^_^":"T_T");
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    rsyslog
    java实现黄金分割数
    java实现黄金分割数
    java实现黄金分割数
    java实现黄金分割数
    java实现黄金分割数
    java实现低碳生活大奖赛
    java实现低碳生活大奖赛
    java实现低碳生活大奖赛
    java实现低碳生活大奖赛
  • 原文地址:https://www.cnblogs.com/Scx117/p/8916144.html
Copyright © 2011-2022 走看看