1.亲戚(并查集)

#include<iostream>
using namespace std;
int n,m,p;
int m1,m2,p1,p2;
int f[5005];
int find(int x)//查询根节点,根节点的标志是根节点的父节点是自己
{
if(f[x]!=x)f[x]=find(f[x]);//路径压缩,父节点变为根节点,方便下次询问
return f[x];
}
void combine(int a,int b)
{
f[find(a)]=find(b);
}
int main()
{
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
f[i]=i;//先让每个节点的父节点是自己
for(int i=1;i<=m;i++)
{
cin>>m1>>m2;
combine(m1,m2);//是两个集合的合并,让一个集合的根节点的父节点等于另外一个集合的根节点
}
for(int i=1;i<=p;i++)
{
cin>>p1>>p2;
if(find(p1)==find(p2))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
从题目中来看,这是一对一对的亲戚关系,具有亲戚关系的是一个集合,如果两个集合中有同一个人,说明另外两个人也有亲戚关系,那他们就应该合并这两个集合,这不就是并查集支持的操作吗?我们定义一个父节点数组表示i节点的父节点,先让每个节点的父节点是自己,当两个人是亲戚时,我们就合并两个集合,让一个集合的根节点的父节点等于另外一个集合的根节点,循环结束后,具有亲戚关系的都在同一个集合里,如果两个人所在集合的根节点是相同的,这两个人就是亲戚,否则不是。
2.团伙(并查集)

#include<iostream>
using namespace std;
int n,m,p,q,f[100010],cnt=0;
int rsp[1010][1010];//定义一个二维数组表示两个人是否是敌人
char opt;

文章介绍了并查集在亲戚关系判断、团伙分析中的应用,以及哈希表、map和set在处理字符串、查找和去重中的使用,同时涉及一维和二维前缀和在求解区间和和最大加权矩形问题中的作用,展示了这些IT技术在实际问题中的解决方案。
最低0.47元/天 解锁文章
80

被折叠的 条评论
为什么被折叠?



