UVA 12083 - Guardian of Decency(二分图最大匹配)

UVA 12083 - Guardian of Decency

题目链接

题意:给定一些男女,满足身高差不大于40,喜欢同一种音乐,不喜欢同一种体育项目,并且性别不同,就可能发生关系,现在老师要带一些男女出去玩,要求不能有一对发生关系,问最多能带多少人

思路:分男女,把会发生关系的连边,然后做最大匹配,最后n-最大匹配就是最多能带的人

代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <cstdlib>
using namespace std;

const int N = 505;

struct People {
	int h;
	string music, sport;
	People() {}
	People(int h, string music, string sport) {
		this->h = h;
		this->music = music;
		this->sport = sport;
	}
}boy[N], girl[N];

vector<int> g[N];

int bn, gn;

int T, n;

bool judge(People a, People b) {
	if (abs(a.h - b.h) <= 40 && a.music == b.music && a.sport != b.sport) return true;
	return false;
}

int match[N], vis[N];

bool dfs(int u) {
	for (int i = 0; i < g[u].size(); i++) {
		int v = g[u][i];
		if (vis[v]) continue;
		vis[v] = 1;
		if (match[v] == -1 || dfs(match[v])) {
			match[v] = u;
			return true;
		}
	}
	return false;
}

int hungary() {
	int ans = 0;
	memset(match, -1, sizeof(match));
	for (int i = 0; i < bn; i++) {
		memset(vis, 0, sizeof(vis));
		if (dfs(i)) ans++;
	}
	return ans;
}

int main() {
	cin >> T;
	while (T--) {
		cin >> n;
		int h; bn = gn = 0;
		string sex, music, sport;
		for (int i = 0; i < n; i++) {
			cin >> h >> sex >> music >> sport;
			if (sex == "M") boy[bn++] = People(h, music, sport);
			else girl[gn++] = People(h, music, sport);
		}
		for (int i = 0; i < bn; i++) {
			g[i].clear();
			for (int j = 0; j < gn; j++) {
				if (judge(boy[i], girl[j]))
					g[i].push_back(j);
			}
		}
		printf("%d\n", n - hungary());
	}
	return 0;
}
时间: 2024-07-29 10:56:21

UVA 12083 - Guardian of Decency(二分图最大匹配)的相关文章

uva 12083 Guardian of Decency (二分图匹配)

uva 12083 Guardian of Decency Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is afraid that some of them might become couples. While you can never exclude this poss

UVA - 12083 Guardian of Decency (二分匹配)

题意:有N个人,已知身高.性别.音乐.运动.要求选出尽可能多的人,使这些人两两之间至少满足下列四个条件之一. 1.身高差>40  2.性别相同  3.音乐不同  4.运动相同 分析: 1.很显然性别相同的人一定能一起去,问题就在于如何在这些性别相同的人中加入性别不同的人. 2.把男女分开,进行二分匹配. 如果某个男生A与任何一个女生都满足条件1.3.4之一,那这个男生就可以和这些女生一起选择. 反之,如果按照男女之间不满足条件1.3.4中的任何一个的原则连线,那么诸如男生A这样的男生是不会与任何

POJ - 2771 Guardian of Decency 二分图 最大匹配数

题目大意:有n个人要参加一项活动,活动要求参加的人里面尽量不要有couples,主办方提出了四个降低couples的方法: 1.两个人的身高差大于40 2.性别相同 3.喜欢的音乐风格不同 4.喜欢的运动相同 只要满足其中的一项就认定两人不是couples 现在给出n个人的四项数据,问最多能邀请到多少人 解题思路:这题和Poj 1466 Girls and Boys这题很相似,只不过这题给的条件不是直接给出的,而是要我们自己去找的 只要两个人四个条件都不满足,就可以认为他们是couples了(相

POJ 2771 Guardian of Decency (二分图最大点独立集)

Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 2555 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is afraid that

poj——2771 Guardian of Decency

poj——2771    Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5916   Accepted: 2458 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he i

poj 2771 Guardian of Decency【最大点独立集】

K - Guardian of Decency Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2771 Appoint description:  System Crawler  (2014-08-17) Description Frank N. Stein is a very conservative high-school teac

poj 2771 Guardian of Decency 解题报告

题目链接:http://poj.org/problem?id=2771 题目意思:有一个保守的老师要带他的学生来一次短途旅行,但是他又害怕有些人会变成情侣关系,于是就想出了一个方法: 1.身高差距  > 40cm 2.相同性别 3.喜欢的音乐种类  不同 4.有共同喜爱的 运动 只要满足其中这4个条件中的一个(当然越多越好啦),就可以将他们编为一组啦(一组两个人),求能被编为一组的最多组数. 这题实质上求的是二分图的最大独立集.  最大独立集 = 顶点数 - 最大匹配数 可以这样转化:两个人至少

POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)

解题报告 http://blog.csdn.net/juncoder/article/details/38159017 题目传送门 题意: 看到题目我就笑了,,, 老师认为这样的两个学生不是一对: 身高相差40以上(年龄都不是距离了,身高又算什么) 不同性别(sad,,,就不允许基友存在呀,,,谁的肥皂掉了,,,) 喜欢不一样的歌曲类型(你总不能要求两人整天听小苹果吧,,,,,,你是我的小丫小苹果,,,,,,) 喜欢一样的运动( they are likely to be fans of dif

匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对的点出发,历经未配边.匹配边.未配边.匹配边.未配边....最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了.这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配. 1 #include<cstdio> 2 #include<cstring&g