`
duoerbasilu
  • 浏览: 1542093 次
文章分类
社区版块
存档分类
最新评论

HDU 3081 Marriage Match II(匈牙利算法 + 并查集)

 
阅读更多
/*
WA,但是不知道原因
题意:2*n个同学,n个男生,n个女生,m组数据表示两同学之间没有争吵,女同学中f组朋友。女同学寻找男朋友,如果他们之间或者她的朋友与那个男生之间无争吵,则可以作男朋友。当所有女生都找到男朋友后,则完成一轮。问最终有多少轮。
题解:匈牙利算法 + 并查集
问题显然是二分图最大匹配问题,如果最大匹配为n,则完成一轮。每完成一轮,需要进行一些处理,相同女同学不能选择同样的男生作为男朋友。因为女同学朋友之间是相互的,用并查集可以得到很好地解决。
*/

#include <iostream>
#define re(i, n) for(int i = 0; i < n; ++ i)
using namespace std;

const int nMax = 105;
int p[nMax];
int link[nMax];
int useif[nMax];
int map[nMax][nMax];
//int fhash[nMax][nMax];
int T, n, m, f;

int find(int x)//并查集
{
	return p[x] == x ? x : p[x] = find(p[x]);
}

int getPath(int t)//寻找增广路经
{
	re(i, n)
	{
		if(!useif[i] && map[t][i])
		{
			useif[i] = 1;
			if(link[i] == -1 || getPath(link[i]))
			{
				link[i] = t;
				return 1;
			}
		}
	}
	return 0;
}

int getNum()//匈牙利算法,匈牙利算法最坏复杂度O(N^3)
{
	int sum = 0;
	memset(link, -1, sizeof(link));
	re(i, n)
	{
		memset(useif, 0, sizeof(useif));
		sum += getPath(i);
	}
	if(sum == n)
		re(i, n)
		{
			map[link[i]][i] = 0;
		}
	return sum;
}

int main()
{
	//freopen("f://data.in", "r", stdin);
	scanf("%d", &T);
	while(T --)
	{
		scanf("%d %d %d", &n, &m, &f);
		int a, b;
		re(i, m)
		{
			scanf("%d %d", &a, &b);
			-- a;
			-- b;
			map[a][b] = 1;
		}
		re(i, n)
			p[i] = i;
		re(i, f)
		{
			scanf("%d %d", &a, &b);
			-- a;
			-- b;
			if(find(a) != find(b))
				p[a] = find(b);
		}
		/*
		re(i, n) re(j, n)//这里曾经出错,第二个误写成re(j, m),纠结了好久
		{
			if(map[i][j])
			{
				map[find(i)][find(j)] = 1;
			}
		}*/
		re(i, n)//朋友间关系的处理,如果i和j互为朋友,且j和k无争吵,则i和k也无争吵
		{
			int si = find(i);
			re(j, n)
				if(i != j && si == find(j))
					re(k, n)
					if(map[j][k])
						map[i][k] = 1;
		}
		//memset(fhash, 0, sizeof(fhash));
		int ans = 0;
		while(getNum() == n) ans ++;
		printf("%d\n",ans);
	}
	return 0;
}

分享到:
评论

相关推荐

    (HDUACM201403版_06)并查集(最小生成树)

    杭电ACM课件2014版之 (HDUACM201403版_06)并查集(最小生成树)

    (HDUACM2010版_06)并查集(最小生成树)

    (HDUACM2010版_06)并查集(最小生成树(HDUACM2010版_06)并查集(最小生成树(HDUACM2010版_06)并查集(最小生成树(HDUACM2010版_06)并查集(最小生成树

    并查集问题

    3. (HDUACM2010版_06)并查集(最小生成树).ppt:这是一个PPT文件,可能详细介绍了如何使用并查集来求解最小生成树的问题,包括理论知识、算法流程和示例解析。 4. hdoj1829二分图识别的并查集.txt:二分图是图论...

    hdu ACM代码 每种算法都有分类

    6. **数据结构**:线段树、斐波那契堆、平衡树(AVL、红黑树)、字典树(Trie)、并查集等,这些高级数据结构可以高效地解决区间查询、维护、集合操作等问题。 7. **几何算法**:二维和三维几何问题,如点线面的...

    算法竞赛专题解析--并查集1

    【并查集详解】 并查集(Disjoint Set)是一种数据结构,用于高效处理不相交集合的合并和查询操作。在算法竞赛中,它常用于解决如连通子图、最小生成树(如Kruskal算法)以及最近公共祖先(LCA)等问题。其核心思想...

    acm课件 HDU 算法大全

    acm 技术大牛 课件 HDU 自学必备课件 全套齐全 (lecture_01)初识ACM (lecture_02)简单数学题 (lecture_03)递推求解 (lecture_04)动态规划(1)_ (lecture_05)计算几何基础_ (lecture_06)母函数 ...并查集

    HDU算法讲解的PPT

    HDU算法讲解的PPT是一份非常有价值的教育资源,由知名教育机构HDU(杭州电子科技大学)的lcy老师精心制作并讲解。这份PPT涵盖了算法的各个方面,是学习和提升算法能力的理想材料。标签“算法”、“讲解”和“经典”...

    ACM-HDU涉及了很多算法

    在ACM(国际大学生程序设计竞赛)中,HDU(杭州电子科技大学)的在线判题系统是许多参赛者磨炼算法技巧的重要平台。这个平台涵盖了众多的算法问题,旨在提升参赛者的编程能力和逻辑思维能力。以下是对标题和描述中...

    HDU+2000-2099+解题报告

    HDU(杭州电子科技大学)在线评测系统是许多编程竞赛爱好者和学习者经常访问的平台,它提供了大量的算法题目供用户练习和挑战。这个压缩包文件“HDU 2000-2099 解题报告”显然包含了在这个题号范围内的一些问题、...

    hdu 1695 GCD(欧拉函数+容斥原理).docx

    "hdu 1695 GCD(欧拉函数+容斥原理)" 题目大意是:给定 a, b, c, d, k,找到一队 x, y,满足 g(x, y) = k,且 x ∈ [1, b], y ∈ [1, d],问有多少对符合要求的 (x, y)。 思路是:gcd(x, y) == k 解释 x, y 都能...

    hdu动态规划算法集锦

    根据提供的信息,我们可以总结出以下关于“hdu动态规划算法集锦”的知识点: ### 动态规划基础概念 动态规划是一种解决多阶段决策问题的方法,它通过将原问题分解为互相重叠的子问题,利用子问题的解来构建原问题...

    HDU+2000-2099+解题报告.zip

    《杭电OnlineJudge 2000-2099解题报告》是针对杭州电子科技大学(HDU)在线评测系统(OnlineJudge)中2000至2099题目的详细解答集锦,主要涵盖了算法分析、编程技巧以及问题解决策略等内容。这份解题报告以CHM...

    HDU ACM as easy as a+b

    - **排序算法**:代码中使用了冒泡排序算法对数组进行排序。冒泡排序是一种简单但效率较低的排序方法,其基本思想是比较相邻的元素,如果它们的顺序错误就把它们交换过来。 - **读取输入数据**:通过 `scanf` 函数...

    hdu 300+ AC 代码

    HDU 300+ AC 代码集合是一个包含超过300个已通过验证的算法解决方案的资源,这些代码主要用于解决各类计算机编程竞赛中的问题。这些竞赛通常由杭州电子科技大学(HDU)主办,旨在提升参赛者的算法设计、编程和问题...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    hdu.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    ACM HDU题目分类

    贪心算法是一种常用的算法思想,在 ACM HDU 题目分类中,贪心算法也占据了一定的比例。例如,1009 贪心;1050 贪心;1052 贪心;1053 贪心,关于 Huffman 编码 等等。 数学题 数学题是 ACM HDU 题目分类中的一大类...

    HDU刷题地图+精选详细笔记

    本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!

    hdu1010搜索算法

    杭州电子科技大学oj平台上的第1010题,是关于搜索的题目,很不错的题

Global site tag (gtag.js) - Google Analytics