1892 团伙
这个题之前从zp老师那听过
这里涉及到并查集的反集操作,和环形DP的性质很像,再看一个集合用来存储其中这两个集合是相反的,称之为反集
第一数据范围的时候需要开两倍
再次总结一下这个反集的操作
说白了,我们既要维护一个人的朋友和敌人,维护两个信息,所以使用两个集合,如果可以,个人猜测用结构体也可以实现吧
最后,要求团队的个数,那就是统计代表元素的个数,最后输出
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int SIZE=2e4+5;
int n,m;
char ch;int a,b;
int f[SIZE*2];//两个集合
int ans;
int findd(int x)
{
return f[x]==x?x:f[x]=findd(f[x]);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=2*n;i++)
{
f[i]=i;
}
for(int i=1;i<=m;i++)
{
cin>>ch;
cin>>a>>b;
if(ch=='F')
{
f[findd(a)]=findd(b);//朋友直接合并
}
else//敌人关系,反集合并
{
f[findd(a+n)]=findd(b);
f[findd(b+n)]=findd(a);
}
}
for(int i=1;i<=n;i++)
{
if(f[i]==i)
ans++;
}
cout<<ans<<endl;
return 0;
}
462

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



