P1551 亲戚 题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 题目描述 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚. 输入格式 第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系. 以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=…
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1551 思路: 很显然地我们会发现,这是一道并查集的模板题,并且是考察了并查集中的”并“和”查“的操作(好像所有关于亲戚的题都与并查集有关... 然后就是一个并查集的模板了,可以尝试记住(亏自己先会了最小生成树... AC代码: #include<cstdio> #include<iostream> using namespace std; ]; int a, b, c, d; in…
题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=pySmxSVgP [问题描述]     或许你并不知道,你的某个朋友是你的亲戚.他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子.如果能得到完整的家谱,判断两个人是否是亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及.在这种情况下,最好的帮手是计算机.    为了将问题简化,你将得到一些亲戚关系的信息,如同Xuebin和G…
并查集 定义:并查集是一种树形的数据结构,用于处理一些不相交集合的合并及查询问题 主要构成: 并查集主要由一个整型数组pre[]和两个函数find().join()构成. 数组pre[]记录了每个点的前驱结点是谁,函数find(x)用于查找指定结点x属于哪个集合,函数join(x,y)用于合并两个结点x和y. 作用: 并查集的主要作用是求联动分支数. 代表元: 用集合中的某个元素来代表这个集合,则该元素称为此集合的代表元 find()函数的定义与实现:  int find(int x){  wh…
链接 https://www.luogu.org/problemnew/show/P1551 代码 #include<bits/stdc++.h> using namespace std; #define ll long long const int maxn=1e5; int par[maxn]; int rank1[maxn]; void f(int n) //初始化 { ;i<n;i++) { par[i]=i; rank1[i]=; } } int find(int x) { i…
并查集的模板题: #include<iostream> #include<cstdio> using namespace std; ; int fa[maxn]; int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); } void unite(int x, int y) { int x1 = find(x); int y1 = find(y); if (x1 != y1)fa[x1] = y1; } int m…
简单的关系并查集一般非常easy依据给出的关系搞出一个有向的环,那么两者之间的关系就变成了两者之间的距离. 对于此题: 若u.v不在一个集合内,则显然此条语句会合法(暂且忽略后两条.下同). 那么将fu 变为 fv的儿子时需加一条权值为 w 的边,w 满足(w + ru)%3 = (rv+ (D == 1? 0 : 1))%3(ru.rv分别为u,v与fv的关系,即距离). 之所以在D == 2时加 1.是由于u吃v表明着u到fv的距离比v到fv的距离大1. 同理.D == 1时,表明两者到fv…
题目背景 奶牛爱干草 题目描述 Bessie 计划调查N (2 <= N <= 2,000)个农场的干草情况,它从1号农场出发.农场之间总共有M (1 <= M <= 10,000)条双向道路,所有道路的总长度不超过1,000,000,000.有些农场之间存在着多条道路,所有的农场之间都是连通的. Bessie希望计算出该图中最小生成树中的最长边的长度. 输入输出格式 输入格式: 两个整数N和M. 接下来M行,每行三个用空格隔开的整数A_i, B_i和L_i,表示A_i和 B_i之…
题目描述 众所周知,香港的黑社会组织猖獗,警方希望能摸清他们的内部构成情况,特派小生前往调查.经过长期的卧底,小生初步获得了一些资料:整个组织有 n 个人,任何两个认识的人不是朋友就是敌人. 而且满足:①我朋友的朋友是我的朋友:②我敌人的敌人是我的朋友.所有是朋友的人组成一个团伙. 现在,警方委派你协助调查,拥有关于这 n 个人的 m 条信息(即某两个人是朋友,或某两个人是敌人) ,请你计算出这个城市最多可能有多少个团伙. 数据范围 2≤N≤2000,1≤M≤5000. 输入输出格式 输入描述:…
题目描述 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙? 输入 第1行为n和m,N小于1000,M小于5000: 以下m行,每行为p x y,p的值为0或1,p为0时,表示x和y是朋友,p为1时,表示x和y是敌人. 输出 一个整数,表示这n个人最多可能有几个团伙.…