poj2239 Selecting Courses --- 二分图最大匹配

时间:2023-03-10 02:59:19
poj2239 Selecting Courses --- 二分图最大匹配

匈牙利算法模板题

有n门课程,每门课程可能有不同一时候间,不同一时候间的课程等价。

问不冲突的情况下最多能选多少门课。

建立二分图,一边顶点表示不同课程,还有一边表示课程的时间(hash一下)。

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define eps 1e-6
#define ll __int64
using namespace std; int mp[310][310],used[310],link[310],n,m; bool dfs(int x)
{
for(int i=1;i<=m;i++)
{
if(!used[i]&&mp[x][i])
{
used[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=x;
return 1;
}
}
}
return 0;
} int hungry()
{
int res=0;
memset(link,-1,sizeof link);
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof used);
if(dfs(i))
res++;
}
return res;
} int main()
{
int i,a,b;
while(~scanf("%d",&n))
{
memset(mp,0,sizeof mp);
for(i=1;i<=n;i++)
{
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&a,&b);
mp[i][(a-1)*12+b]=1;
}
}
m=7*12;
printf("%d\n",hungry());
}
return 0;
}