首页 > 代码库 > POJ 2239 Selecting Course 二分图匹配(水)

POJ 2239 Selecting Course 二分图匹配(水)

http://poj.org/problem?id=2239

题意:总共7天,每天有12个教室使用,每门课有(t,pi,qi) 表示该门课每周开t次
在第qi天,第pi间教室i=1..t 总共n门课 n<=300,问最多能选多少种不同的课程?

左边点为课程 右边点为(p,q) 把(p,q)看成排列中的序数 化成整数(p-1)*12+q.
求二分图的最大匹配即可 复杂度为O(nm)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=3e2+20;
const int M=3e4;
int n,m;
int linker[M],vis[M];
int g[N][M];
bool dfs(int u)
{
	for(int i=1;i<=m;i++)
	{
		if(g[u][i]&&vis[i]==0)
		{
			vis[i]=1;
			//u-i ·??¥??±? i-linker[i]?a?¥??±? 
			//?òμ?·??¥??μ??ò??×??¥??±? 
			if(linker[i]==-1||dfs(linker[i])) 
			{
				linker[i]=u;
				return true;
			}
		}
	}
	return false;
}
int Hungary()
{
	int res=0;
	int u;
	memset(linker,-1,sizeof(linker));
	for(int i=1;i<=n;i++)
	{
		memset(vis,0,sizeof(vis));
		if(dfs(i))
			res++;
	}
	return res;
}
int main()
{
	while(cin>>n)
	{
		int u,v,t;
		m=7*12;
		memset(g,0,sizeof(g));
		for(int i=1;i<=n;i++)
		{
			cin>>t;
			for(int j=1;j<=t;j++)
			{
				cin>>u>>v;
				g[i][(u-1)*12+v]=1;
			}	
		}
		int ans=Hungary();
		cout<<ans<<endl;
	}
	
	return 0;
}

  

 

POJ 2239 Selecting Course 二分图匹配(水)