hoj 2472 IR-Lab

/*

题目:

 

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

 

分析:

       二分匹配问题,按人与他的空余时间连线构图,然后就是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;

 

}

 

posted @ 2012-04-07 16:00  yejinru  阅读(201)  评论(0编辑  收藏  举报