hoj 2472 IRLab

/*

题目:

       值班问题,给出所有人的空余时间,问能不能够在每一个时间里安排一个人值班

分析:

       二分匹配问题,按人与他的空余时间连线构图,然后就是hungry算法了,简单

*/

#include <iostream>

#include <cstring>

#include <cstdio>

using namespace std;

#define X 22

bool g[X][X],use[X];

int xm[X],ym[X],k,p;

bool dfs(int u)

{

       for(int v=0;v<k;v++)

              if(g[u][v]&&!use[v])

              {

                     use[v] = true;

                     if(ym[v]==-1||dfs(ym[v]))

                     {

                            xm[u] = v;

                            ym[v] = u;

                            return true;

                     }

              }

              return false;

}

int hungry()

{

       int ret = 0;

       memset(xm,-1,sizeof(xm));

       memset(ym,-1,sizeof(ym));

       for(int u=0;u<p;u++)

              if(xm[u]==-1)

              {

                     memset(use,false,sizeof(use));

                     if(dfs(u))

                            ret++;

              }

              return ret;

}

int main()

{

       freopen("sum.in","r",stdin);

       freopen("sum.out","w",stdout);

       while(cin>>k>>p,k||p)

       {

              int t,x;

              memset(g,false,sizeof(g));

              for(int i=0;i<p;i++)

              {

                     scanf("%d",&t);

                     while(t--)

                     {

                            scanf("%d",&x);

                            g[i][x] = true;//该人与他的空余时间连通

                     }

              }

              if(hungry()==k)                 //如果能够安排好的话

                     printf("yes\n");

              else

                     printf("no\n");

              //printf("%d\n",hungry());

       }

       return 0;

}

原文地址:https://www.cnblogs.com/yejinru/p/2436081.html