POJ 1733 parity game (hash离散+并查集)

题目要求输入的长度less or equal 1000000000,但是实际的问题数却小于5000

所以我们考虑hash离散化。


解题思路如下:



我们为每一个输入的点,建立struct,内包含2个成员,father指向父亲node,relationship表示与父节点的关系

于是我们有:

===================

图1,我们执行的是查找操作,假设B与A是even关系,C与B是odd关系,那么查找压缩路径后,可以发现A与C是odd关系,于是我们有:

C.relationship=B.relationship^C.relationship; 

对于图2,我们执行的是合并操作,一样可以通过假设举例找出关系,其中xor为输入的B与D的关系

C.relationship=B.relationship^D.relationship^xor;

=================

#include<iostream>
using namespace std;
#define N 5005

/*
hash+离散化===================================================================================
*/
struct node
{
	int val;
	int next;
}E[N];
int v[N], cnt=0;
int hash_1(int n)
{
	int k=n%N;
	for(int e=v[k];e!=-1;e=E[e].next)
	{
		if(E[e].val==n)
			return e;
	}
	E[cnt].next=v[k];
	E[cnt].val=n;
	v[k]=cnt++;
	return cnt-1;
}
/*================================================================================================*/
/*
并查集
*/

struct num
{
	int father;
	int relationship;
}num[N];

void make_set(int n)
{
	for(int i=0;i<n;i++)
	{
		num[i].father=i;
		num[i].relationship=0;  //even
	}
}

int find_set(int x)
{
	if(x==num[x].father)
		return x;
	else
	{
		int  temp=num[x].father;
		num[x].father=find_set(num[x].father);
		num[x].relationship=num[temp].relationship^num[x].relationship; //xor
		return num[x].father;
	}
}

void union_1(int x,int y,int a,int b,int xor)
{
	num[y].father=x;
	num[y].relationship=num[a].relationship^num[b].relationship^xor;
}




void main()
{
	int xor,M1,M2,a,b,a1,b1;
	char op[7];
	int sum;
	bool flag;
	memset(v,-1,sizeof(v));
	while(cin>>M1>>M2)
	{
		flag=true;
		make_set(N);
		sum=0;
		for(int i=0;i<M2;i++)
		{
			cin>>a>>b>>op;
			a--;//半开区间(a,b],注意a--
			if(op[0]=='o')
				xor=1;
			else xor=0;
			a=hash_1(a);
			b=hash_1(b);
			a1=find_set(a);
			b1=find_set(b);
			if(a1==b1)
			{
				if(num[a].relationship^num[b].relationship!=xor)
					 flag=false;
				else
				    {if(flag)
					     sum++;
				    }
				
			}
			else
			{
			   if(flag)
			   {
				   sum++;
			   }
				union_1(a1,b1,a,b,xor);
			}
		}
		cout<<sum<<endl;
	}
	
}


数据集介绍:塑料瓶硬币目标检测数据集 一、基础信息 数据集名称:塑料瓶硬币目标检测数据集 数据规模: - 训练集:5,699张图片 - 验证集:885张图片 - 测试集:414张图片 分类类别: - Plastic(塑料制品):涵盖常见塑料物品的检测 - Bottle(瓶类):包括各类塑料瓶及其他瓶型 - Coin(硬币):多国硬币的识别与定位 标注格式: YOLO格式标注,包含边界框坐标及类别标签,适配主流目标检测框架 二、适用场景 环保回收系统开发: 支持构建智能垃圾分类模型,精准识别塑料制品与瓶类,助力自动化分拣流水线建设。 零售自动化设备: 适用于自动售货机硬币识别模块开发,提升支付系统的准确性与可靠性。 计算机视觉教学: 提供多目标检测场景,适合目标检测算法教学与实验验证。 工业质检应用: 可用于塑料制品生产线中的缺陷检测或产品分类场景。 三、数据集优势 类别覆盖精准: 包含塑料制品、瓶类、硬币三大垂直类别,覆盖环保、零售等核心应用场景需求。 标注质量优异: 严格校验的YOLO格式标注,边界框定位精准,支持高精度目标检测模型训练。 场景多样性丰富: 数据包含不同光照条件下的硬币、多角度瓶体形态、多样化塑料制品,增强模型泛化能力。 工业适配性强: 数据规模适配工业级模型训练需求,支持从实验研究到实际部署的全流程开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值