2024 食物链

算法维护食物链关系:并查集与启发式合并的应用
本文探讨了如何使用C++编程语言中的并查集数据结构解决关于食物链中同类、敌人关系的问题,通过启发式合并的方式处理不同关系类型的合并操作,最终计算冲突和合并的总数。

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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值