HDU1083 最大二分匹配

这个题目又是二分匹配的水题。

题目是有P门课程,有N个童鞋,每一课程有几个同学学。然后期末结束了,这些童鞋就要上台去表演他们所学课程的内容(一个同学只能表演一门课程鄙视,干嘛不让学霸一个人全部表演完-_-),然后要你判断这些口爱的同学能否将所有课程都表演完。

典型的二分匹配呀,求得最大匹配数后,与课程数比较一下,如何相等就可以啦。

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <time.h>
#include <limits.h>
#define N 310
using namespace std;
int match[N];
int map[N][110];//map[i][j]表示第i个学生学习了第j门课
int used[N];
int m,n,p;
int ans ;
int dfs(int x)
{
for(int i = 1;i<=p;i++)
{
if(map[x][i]>0&&used[i]==0)
{
used[i]=1;
if(match[i]==-1||dfs(match[i])==1)
{
match[i]=x;
return 1 ;
}
}
}
  return  0 ;
}
int main()
{
int t ;
scanf("%d%",&t);
while(t--)
{
memset(map,0,sizeof(map));
memset(match,-1,sizeof(match));
ans = 0 ;
scanf("%d%d",&p,&n);
for(int i  = 1 ;i<=p;i++)
{
int l ;
scanf("%d",&l);
while(l--)
{
int x ;
scanf("%d",&x);
map[x][i]=1;
}
}
for(int i = 1 ; i<=n;i++)
{
memset(used,0,sizeof(used));
if(dfs(i)==1) ans++;
}
if(ans==p)printf("YES\n");
else printf("NO\n");
}
return  0 ;
}






#include <stdio.h>

#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <time.h>
#include <limits.h>
#define N 310
using namespace std;
int match[N];
int map[N][110];//map[i][j]表示第i个学生学习了第j门课
int used[N];
int m,n,p;
int ans ;
int dfs(int x)
{
for(int i = 1;i<=p;i++)
{
if(map[x][i]>0&&used[i]==0)
{
used[i]=1;
if(match[i]==-1||dfs(match[i])==1)
{
match[i]=x;
return 1 ;
}
}
}
  return  0 ;
}
int main()
{
int t ;
scanf("%d%",&t);
while(t--)
{
memset(map,0,sizeof(map));
memset(match,-1,sizeof(match));
ans = 0 ;
scanf("%d%d",&p,&n);
for(int i  = 1 ;i<=p;i++)
{
int l ;
scanf("%d",&l);
while(l--)
{
int x ;
scanf("%d",&x);
map[x][i]=1;
}
}
for(int i = 1 ; i<=n;i++)
{
memset(used,0,sizeof(used));
if(dfs(i)==1) ans++;
}
if(ans==p)printf("YES\n");
else printf("NO\n");
}
return  0 ;
}

你可能感兴趣的:(Algorithm,最大二分匹配)