/*
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;
}
分享到:
相关推荐
杭电ACM课件2014版之 (HDUACM201403版_06)并查集(最小生成树)
(HDUACM2010版_06)并查集(最小生成树(HDUACM2010版_06)并查集(最小生成树(HDUACM2010版_06)并查集(最小生成树(HDUACM2010版_06)并查集(最小生成树
3. (HDUACM2010版_06)并查集(最小生成树).ppt:这是一个PPT文件,可能详细介绍了如何使用并查集来求解最小生成树的问题,包括理论知识、算法流程和示例解析。 4. hdoj1829二分图识别的并查集.txt:二分图是图论...
6. **数据结构**:线段树、斐波那契堆、平衡树(AVL、红黑树)、字典树(Trie)、并查集等,这些高级数据结构可以高效地解决区间查询、维护、集合操作等问题。 7. **几何算法**:二维和三维几何问题,如点线面的...
【并查集详解】 并查集(Disjoint Set)是一种数据结构,用于高效处理不相交集合的合并和查询操作。在算法竞赛中,它常用于解决如连通子图、最小生成树(如Kruskal算法)以及最近公共祖先(LCA)等问题。其核心思想...
acm 技术大牛 课件 HDU 自学必备课件 全套齐全 (lecture_01)初识ACM (lecture_02)简单数学题 (lecture_03)递推求解 (lecture_04)动态规划(1)_ (lecture_05)计算几何基础_ (lecture_06)母函数 ...并查集
HDU算法讲解的PPT是一份非常有价值的教育资源,由知名教育机构HDU(杭州电子科技大学)的lcy老师精心制作并讲解。这份PPT涵盖了算法的各个方面,是学习和提升算法能力的理想材料。标签“算法”、“讲解”和“经典”...
在ACM(国际大学生程序设计竞赛)中,HDU(杭州电子科技大学)的在线判题系统是许多参赛者磨炼算法技巧的重要平台。这个平台涵盖了众多的算法问题,旨在提升参赛者的编程能力和逻辑思维能力。以下是对标题和描述中...
HDU(杭州电子科技大学)在线评测系统是许多编程竞赛爱好者和学习者经常访问的平台,它提供了大量的算法题目供用户练习和挑战。这个压缩包文件“HDU 2000-2099 解题报告”显然包含了在这个题号范围内的一些问题、...
"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动态规划算法集锦”的知识点: ### 动态规划基础概念 动态规划是一种解决多阶段决策问题的方法,它通过将原问题分解为互相重叠的子问题,利用子问题的解来构建原问题...
《杭电OnlineJudge 2000-2099解题报告》是针对杭州电子科技大学(HDU)在线评测系统(OnlineJudge)中2000至2099题目的详细解答集锦,主要涵盖了算法分析、编程技巧以及问题解决策略等内容。这份解题报告以CHM...
- **排序算法**:代码中使用了冒泡排序算法对数组进行排序。冒泡排序是一种简单但效率较低的排序方法,其基本思想是比较相邻的元素,如果它们的顺序错误就把它们交换过来。 - **读取输入数据**:通过 `scanf` 函数...
HDU 300+ AC 代码集合是一个包含超过300个已通过验证的算法解决方案的资源,这些代码主要用于解决各类计算机编程竞赛中的问题。这些竞赛通常由杭州电子科技大学(HDU)主办,旨在提升参赛者的算法设计、编程和问题...
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...
贪心算法是一种常用的算法思想,在 ACM HDU 题目分类中,贪心算法也占据了一定的比例。例如,1009 贪心;1050 贪心;1052 贪心;1053 贪心,关于 Huffman 编码 等等。 数学题 数学题是 ACM HDU 题目分类中的一大类...
本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!
杭州电子科技大学oj平台上的第1010题,是关于搜索的题目,很不错的题