您的位置:首页 > 其它

hoj 2472 IR-Lab

2012-04-07 16:00 246 查看
/*

题目:

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

分析:

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: