码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-06-19 17:45:03      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:eof   mem   i++   最大匹配   while   poj   最大   课程   logs   

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 二分图匹配(水)

标签:eof   mem   i++   最大匹配   while   poj   最大   课程   logs   

原文地址:http://www.cnblogs.com/HIKARI1149/p/7049697.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!