您的位置:首页 > 其它

POJ 1469 COURSES(二分匹配-hungary)

2015-12-31 13:09 405 查看
Description

n名学生上p们课,每门学生都有自己要去上的几门课,问每门课是否都有学生去上

Input

第一行为一个整数T表示用例组数,每组用例第一行为两个整数n和p表示学生人数和课程数,之后n行每行首先输入一个整数num表示这名学生要去上的课程数量,之后num个整数表示这名学生要上的课

Output

对于每组用例,如果每门课都有学生去上则输出YES,否则输出NO

Sample Input

2

3 3

3 1 2 3

2 1 2

1 1

3 3

2 1 3

2 1 3

1 1

Sample Output

YES

NO

Solution

二分匹配裸题,判断最大匹配数是否为p即可

Code

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 1111
int uN,vN;//u,v数目
int g[maxn][maxn];//编号是0~n-1的
int linker[maxn];
bool used[maxn];
bool dfs(int u)
{
int v;
for(v=0;v<vN;v++)
if(g[u][v]&&!used[v])
{
used[v]=true;
if(linker[v]==-1||dfs(linker[v]))
{
linker[v]=u;
return true;
}
}
return false;
}
int hungary()
{
int res=0;
int u;
memset(linker,-1,sizeof(linker));
for(u=0;u<uN;u++)
{
memset(used,0,sizeof(used));
if(dfs(u))  res++;
}
return res;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&uN,&vN);
memset(g,0,sizeof(g));
for(int i=0;i<uN;i++)
{
int num,j;
scanf("%d",&num);
while(num--)
{
scanf("%d",&j);
g[i][j-1]=1;
}
}
if(hungary()==uN)printf("YES\n");
else printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: