poj 2239 Selecting Courses

// 题意:一共有n门课程,每门课都有对应的几个可以选择的上课时间,为星期几的第几节。
// 一个时间段只能上一门课,问最多可以选择几门课

#include<iostream> //二分图的最大匹配
#include<cstring>
using namespace std;
int edge[400][100],vis[100],link[100];
int find(int a)
{
for(int i=1;i<=84;++i) // V1子集下标范围[1,n],V2子集下标范围[1,84]
{
if( edge[a][i] && !vis[i] )
{
vis[i]=1;
if( link[i]==0 || find(link[i]) )
{
link[i]=a;
return 1;
}
}
}
return 0;
}
int main()
{
int n;
while(cin>>n)
{
memset(edge,0,sizeof(edge));
memset(link,0,sizeof(link));
int t,p,q;
for(int i=1;i<=n;++i)
{
cin>>t;
while(t--)
{
cin>>p>>q;
edge[i][(p-1)*12+q]=1; // 构图时是课程序号(1..n)到课的序列号:(p-1)*12+q
}
}
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-22 22:50  sysu_mjc  阅读(186)  评论(0编辑  收藏  举报

导航