二分图匹配----匈牙利算法之四

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;
}

  

posted on 2011-07-19 21:37  sysu_mjc  阅读(116)  评论(0编辑  收藏  举报

导航