二分图匹配----匈牙利算法之四
poj 2239 Selecting Courses
//题意:一共有n门课程,每门课都有对应的几个可以选择的上课时间,为星期几的第几节。问你最多可能选择几门课?
poj 2239 Selecting Courses
#include<iostream> //二分图的最大匹配
#include<cstring>
using namespace std;
int n,t,p,q;
int edge[400][100],vis[100],result[100];
bool find(int a)
{
for(int i=0;i<=83;++i) //当p=7,q=12,(p-1)*12+(q-1)=83;
if(edge[a][i]==1&&vis[i]==0)
{
vis[i]=1;
if(result[i]==0||find(result[i]))
{
result[i]=a;
return true;
}
}
return false;
}
int main()
{
while(cin>>n)
{
memset(edge,0,sizeof(edge));
memset(result,0,sizeof(result));
for(int i=1;i<=n;++i)
{
cin>>t;
while(t--)
{
cin>>p>>q;
edge[i][(p-1)*12+(q-1)]=1; //构图时是课程序号(1..n)到课的序列号:(p-1)*12+q-1
}
}
int ans=0;
for(int i=1;i<=n;++i)
{
memset(vis,0,sizeof(vis));
if(find(i))
ans++;
}
cout<<ans<<endl;
}
return 0;
}