前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDU 1669 -- POJ 2289 Jamie's Contact Groups(二分+二分图多重匹配)

HDU 1669 -- POJ 2289 Jamie's Contact Groups(二分+二分图多重匹配)

作者头像
Ch_Zaqdt
发布2019-01-10 16:10:27
5330
发布2019-01-10 16:10:27
举报
文章被收录于专栏:Zaqdt_ACMZaqdt_ACM

题目链接(POJ):http://poj.org/problem?id=2289

题目链接(HDU):http://acm.hdu.edu.cn/showproblem.php?pid=1669

       题意是Jamie有n个联系人,他现在要把这些人都分成组,现在已知每个人的可以分的分组,然后要求分组后最小化最大组的大小,也就是有一个limit,使得所有组的人数不大于limit,求出limit的最小值。

       思路就是我们可以通过二分去枚举limit这个值,然后跑二分图多重匹配判断当前limit是否符合要求就好了。刚开始用链式前向星写system error,然后改成了邻接矩阵...(其实二分图的点不多,邻接矩阵就够用)


AC代码:

代码语言:javascript
复制
// #include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#define maxn 1010
// #define maxm 505
using namespace std;
struct Link{
	int cnt;
	int k[maxn];
}link[maxn];
bool maps[maxn][maxn];
bool vis[maxn];
int n,m,xx;
char str[20],ch;

void init(){
	memset(maps,false,sizeof(maps));
}

bool dfs(int u, int limit){
	for(int i=1;i<=m;i++){
		if(vis[i] == false && maps[u][i] == true){
			vis[i] = true;
			if(link[i].cnt < limit){
				link[i].k[ ++ link[i].cnt ] = u;
				return true;
			}
			for(int j=1;j<=link[i].cnt;j++){
				if(dfs(link[i].k[j], limit)){
					link[i].k[j] = u;
					return true;
				}
			}
		}
	}
	return false;
}

bool solve(int limit){
	memset(link,0,sizeof(link));
	for(int i=1;i<=n;i++){
		memset(vis,false,sizeof(vis));
		if(!dfs(i, limit)) return false;
	}
	return true;
}

int main()
{
	while(~scanf("%d%d",&n,&m)){
		if(n == 0 && m == 0) break;
		init();
		for(int i=1;i<=n;i++){
			scanf("%s",str);
			while(1){
				scanf("%d%c",&xx, &ch);
				maps[i][xx + 1] = true;
				if(ch == '\n') break;
			}
		}
		int l = 1, r = n, mid, ans = n;
		while(l <= r){
			mid = (l + r) >> 1;
			if(solve(mid)){
				r = mid - 1;
				ans = mid;
			}
			else{
				l = mid + 1;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年11月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档