并查集的题目,有2个帮派的人,如果不是A帮就是B帮的,现在给你m组数据,里面可能有A(answer)问a,b2个人的情况,或者D(different)a,b2人在不同的帮派内,
我也是第一次做这种并查集的题目,看看下别人的思想,确实挺简单的,就是在给一个数组dif,记录与其相反的那个人,开始时初始化为-1,只需要存储一个就可以了。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 100010;
int fa[N], n, m;
int dif[N];
void ini()
{
for(int i = 1; i <= n; ++ i)
{
fa[i] = i;
dif[i] = -1;
}
}
int fint(int a)
{
if(fa[a] != a)
fa[a] = fint(fa[a]);
return fa[a];
}
void uni(int a,int b)
{
int a1 = fint(a);
int b1 = fint(b);
if(a1 != b1)
{
fa[a1] = b1;
}
}
int main(void)
{
int ncase;
cin>>ncase;
while(ncase --)
{
cin >> n >> m;
getchar();
ini();
int a, b;
char ch;
for(int i=1; i<=m; ++i)
{
scanf("%c %d %d", &ch, &a, &b);
getchar();
if(ch == 'A')
{
if(dif[a]==-1 || dif[b]==-1)
{
printf("Not sure yet.\n");
}
else
{
int tmp = fint(dif[a]);
int tmp1 = fint(b);
if(tmp1==tmp)
{
printf("In different gangs.\n");
}
else if(fint(a)==tmp1)
{
printf("In the same gang.\n");
}
else
{
printf("Not sure yet.\n");
}
}
}
else
{
if(dif[a]==-1&&dif[b]==-1)
{
dif[a] = b;
dif[b] = a;
}
else if(dif[a]==-1)
{
dif[a] = b;
uni(dif[b],a);
}
else if(dif[b]==-1)
{
dif[b] = a;
uni(dif[a],b);
}
else
{
uni(dif[a],b);
uni(dif[b],a);
}
}
}
}
return 0;
}
本文介绍了一种使用并查集解决两个帮派成员关系问题的方法。通过维护一个特殊的数组来记录成员之间的对立关系,实现了高效判断成员是否属于同一帮派的功能。文章提供了一个具体的C++实现案例。
2129

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



