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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 二分图匹配(水)的主要内容,如果未能解决你的问题,请参考以下文章

poj——2239 Selecting Courses

[POJ 2239] Selecting Courses

POJ2239-Selecting Courses-(匈牙利算法)

Selecting Courses POJ - 2239(我是沙雕吧 按时间点建边 || 匹配水题)

POJ2239(二分图最大匹配)

POJ2374 Fence Obstacle Course