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

  

时间: 2024-10-01 03:41:41

POJ 2239 Selecting Course 二分图匹配(水)的相关文章

[POJ] 2239 Selecting Courses(二分图最大匹配)

题目地址:http://poj.org/problem?id=2239 Li Ming大学选课,每天12节课,每周7天,每种同样的课可能有多节分布在不同天的不同节.问Li Ming最多可以选多少节课.把n种课划分为X集合,把一周的84节课划分为Y集合, 从Xi向Yi连边,那么就转化成了求二分图的最大匹配数,然后匈牙利算法就可以了. 1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #includ

POJ 2239 Selecting Courses(二分匹配)

题目链接:http://poj.org/problem?id=2239 Description It is well known that it is not easy to select courses in the college, for there is usually conflict among the time of the courses. Li Ming is a student who loves study every much, and at the beginning

poj 2239 Selecting Courses(二分匹配简单模板)

http://poj.org/problem?id=2239 这里要处理的是构图问题p (1 <= p <= 7), q (1 <= q <= 12)分别表示第i门课在一周的第p天的第q节课上 其中二分图的X集合里表示课程i,那么我们要解决的就是Y集合了 将第i门课在一周的第p天的第q节课上进行编号,这样Y集合就是 上课时间的编号了 #include<stdio.h> #include<string.h> #include<math.h> #in

POJ 2239 Selecting Courses【最大匹配】

大意: 有一些课程,每个课程的上课时间在每周可能会有多节,你可以从中任选一个时间去听课, 每周七天一天12节课  告诉你每节课的上课时间问在不冲突的情况下最多上几节课? 分析: 左集合课程 右集合时间 边为该节课对应的上课时间 求最大匹配就行了 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std

poj——2239 Selecting Courses

poj——2239   Selecting Courses Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10656   Accepted: 4814 Description It is well known that it is not easy to select courses in the college, for there is usually conflict among the time of the c

Poj 2239 Selecting Courses 【二分匹配】

Selecting Courses Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9007 Accepted: 4010 Description It is well known that it is not easy to select courses in the college, for there is usually conflict among the time of the courses. Li Ming i

POJ 1936 All in All 匹配, 水题 难度:0

题目 http://poj.org/problem?id=1936 题意 多组数据,每组数据有两个字符串A,B,求A是否是B的子串.(注意是子串,也就是不必在B中连续) 思路 设置计数器cnt为当前已匹配A的长度,明显在扫描B的过程中只需要记住cnt这一个状态. 扫描B,每次与A[cnt]匹配就将计数器增加1,cnt与A的长度一致时A就是B的子串. 感想 这道题也许可以用更复杂的方法. 代码 1 #include <cstdio> 2 #include <cstring> 3 #i

POJ - 2594 Treasure Exploration 二分图匹配 + floyd

题目大意:在火星上有N个矿,有点矿之间存在着一条路,由于在火星比较特殊,该路变成了单向路,且机器人只能出现在这条路的两个端点,问最少需要派多少机器人,才能探清这些矿 解题思路:路可以拼接起来形成一条新的路,所以在所给的条件下还可以再扩展,用floyd将所有能连通的点找出来 接下来就是二分匹配的过程了,求出最大匹配数,在用n-最大匹配数就是答案了 #include<cstdio> #include<cstring> #include<vector> using names

POJ 2239 Selecting Courses

二分图的最大匹配.课程和时间可以看做二分图. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int MAXN=505; int nx,ny; int g[MAXN][MAXN]; int cx[MAXN],cy[MAXN]; int mk[MAXN]; int n; int ZH[10000]; int pat