• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

poj 2239 Selecting Courses 最大二分匹配

       把p,q化为一维之后,直接用匈牙利算法

#include<iostream>
using namespace std;

const int MAX = 200;

bool arcs[MAX][MAX];
int match[MAX];
bool isvisit[MAX];
int n, m = 7*12;

int find(int u)
{
	for (int i = 1; i <= m; i++)
		if (arcs[u][i] && !isvisit[i])
		{
			isvisit[i] = true;
			if (!match[i] || find(match[i]))
			{
				match[i] = u;
				return true;
			}
		}

	return false;
}
int main()
{
	int t, p, q;

	while (cin >> n)
	{
		memset(arcs, false, sizeof(arcs));
		memset(match, 0, sizeof(match));

		for (int j = 1; j <= n; j++)
		{
			cin >> t;
			for (int i = 1; i <= t; i++)
			{
				cin >> p >> q;
				arcs[j][12*(p-1) + q] = true;
			}
		}

		int ans = 0;
		for (int i = 1; i <= n; i++)
		{
			memset(isvisit, false, sizeof(isvisit));
			if (find(i))
				ans++;
		}

		cout << ans << endl;
	}
	return 0;
}

posted on 2011-01-29 21:44  sysuwhj  阅读(292)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3