Estructura de datos 5-4-1 y conjunto de consultas

1. Concepto

La colección de búsqueda de unión es esencialmente el uso del conocimiento del árbol. A menudo se usa para la representación relacionada del conjunto. Es diferente del árbol binario general. La colección de búsqueda de unión usa el puntero al nodo principal, que es conveniente para la clasificación y no es fácil encontrar los nodos secundarios.

En segundo lugar, la implementación del código

Hay principalmente tres funciones para la búsqueda, inicialización, fusión y consulta de uniones simples.

Hay muchas formas de inicializar. Todo se puede inicializar a sí mismo, lo que equivale a tratar cada nodo como un árbol separado en el estado inicial, y estos árboles tienen solo un nodo raíz, de modo que todos apuntan a sí mismos. También se puede inicializar todo a 1. La ventaja de esta inicialización es que puede guardar cuántos nodos hay en este conjunto en el nodo superior.

void init()
{
    
    
	for(int i=1;i<=n;i++)
		data[i]=i;
}
//初始化为自己
void init()
{
    
    
	for(int i=1;i<=n;i++)
		data[i]=-1;
}
//初始化为-1

La combinación es diferente según la forma de inicialización, y hay diferencias sutiles, pero la idea principal es la misma, compare si dos nodos están en un conjunto, si no, significa que puede combinar, use la función de búsqueda para encontrar el nodo raíz del conjunto, y luego deje que uno El nodo raíz apunte a otro, y la operación de fusión se puede completar.

void merge(int x,int y)
{
    
    
	int tx=find(x);
	int ty=find(y);
	if(tx!=ty)
		data[tx]=data[ty];
	//初始化为-1时可以补一句data[ty]+=data[tx],这样数组值的绝对值表示的就是集合中元素的个数
}

Según las diferentes inicializaciones, se deben establecer diferentes indicadores de fin de búsqueda. Cuando se usa la inicialización como self, el signo del final de la búsqueda es que el valor de la posición correspondiente es igual a su propio subíndice. Cuando se inicializa a -1, el signo del final de la búsqueda es que el valor de la posición correspondiente es menor que cero.

int find(int x)
{
    
    
	while(data[x]!=x)
		x=data[x];
	return x;
}
//初始化为自己
int find(int x)
{
    
    
	while(data[x]>=0)
		x=data[x];
	return x;
}
int find(int n)
{
    
    
	if(pre[n]==n)
		return n;
	else
		return pre[n]=find(pre[n]);
}
//递归实现

No es difícil encontrar la colección en sí. No es difícil para las personas mayores cuando participaron en Blue Bridge ACM, solo comprenda el proceso de búsqueda hacia arriba. El código completo es el siguiente

#include<bits/stdc++.h>
using namespace std;
int data[1005];
int m,n,choice=0;
void init()
{
    
    
	for(int i=1;i<=n;i++)
		data[i]=i;
}
int find(int x)
{
    
    
	while(data[x]!=x)
		x=data[x];
	return x;
}
void merge(int x,int y)
{
    
    
	int tx=find(x);
	int ty=find(y);
	if(tx!=ty)
		data[tx]=data[ty];
}
int main()
{
    
    
	scanf("%d %d",&m,&n);
	init();
	for(int i=0;i<m;i++)
	{
    
    
		int x,y;
		scanf("%d %d",&x,&y);
		merge(x,y);
	}
	scanf("%d",&choice);
	while(choice!=-1)
	{
    
    
		printf("%d\n",find(choice));
		scanf("%d",&choice);
	}
		 
	return 0;
 } 

Supongo que te gusta

Origin blog.csdn.net/weixin_43849505/article/details/107499141
Recomendado
Clasificación