2024 食物链
刚刚做完团伙,发现这两个题非常的相似,这个题也是需要维护两个信息,一个是同类一个是敌人关系,所以还是得运用反集的关系,只不过这一个题还有点像程序自动排序这道题,最后需要查询一波
哦,突然恍然大悟,就像启发式合并一样,我说的是我被启发了,不是说知识点像,这个题因为有三种关系,所以,需要定义三个集合来表示
#include<iostream>
using namespace std;
long long n,m,fa[150010];
int opt,x,y,ans;
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void hb(int x,int y)
{
int t1=find(x),t2=find(y);
if(t1!=t2)
{
fa[t1]=t2;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=3*n;i++)
{
fa[i]=i;
}
for(int i=1;i<=m;i++)
{
cin>>opt>>x>>y;
if(x>n||y>n)//超出n
{
ans++;
continue;
}
if(opt==1)
{
if(find(x+n)==find(y)||find(y+n)==find(x))//冲突
{
ans++;
}
else//合并
{
hb(x,y);
hb(x+n,y+n);
hb(x+2*n,y+2*n);
}
}
if(opt==2)
{
if(x==y)//自己吃自己
{
ans++;
continue;
}
if(find(x)==find(y)||find(x)==find(y+n))//冲突
{
ans++;
}
else
{
hb(x+n,y);
hb(x+2*n,y+n);
hb(x,y+2*n);
}
}
}
cout<<ans<<endl;
return 0;
}
算法维护食物链关系:并查集与启发式合并的应用
本文探讨了如何使用C++编程语言中的并查集数据结构解决关于食物链中同类、敌人关系的问题,通过启发式合并的方式处理不同关系类型的合并操作,最终计算冲突和合并的总数。
409

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



