Y con el conjunto adecuado de investigación preliminar

Fácil de aprender un poco ponderada referencia disjunta conjunto de este blog, se sienten bien escrito: https://blog.csdn.net/yjr3426619/article/details/82315133

disjuntos-set general y en comparación con los cambios de código en la principal ruta de tiempo y la compresión de combinación. Pesos entre [x] como un cinturón de peso, el camino del tiempo de compresión para actualizar el peso (típicamente V [x] está representado por x y PAR, necesita ser actualizado para los pesos entre la raíz de x x valor). Entonces, cuando se combinan, para encontrar la raíz px y X py e y, está conectado a la py px (o incluso a py px) cuando deben calcularse los dos pesos. código de actualización específica y se ven como el blog anterior, parecen ser muy clara.

 

Los siguientes tres temas grabados que se dio cuenta del blog en los ejemplos.

hdu 3038: tema Enlace: https://vjudge.net/problem/HDU-3038

El efecto es para darle una serie de intervalos y para determinar cuántos y contradictoria dada antes (si es contradictorio para saltar). Puede ser ponderada disjuntos-set do: visto como los nodos de punto final de intervalo, los pesos entre dos nodos y visto dentro de este rango. Dada la actual dos nodos pertenecen a la misma serie, y el intervalo del mismo puede determinarse, a continuación, determina si o igual a un valor dado, si no igual ans ++; si no pertenecen al mismo conjunto, ponen ellos correspondiente raíces se combinaron, y el peso se determina entre dos raíces. El problema básico es la plantilla, pero hay un punto a la nota: Cada vez que se leerá como punto final dejó intervalo abierto (-1 para hacer que el extremo izquierdo). Ejemplo: Por ejemplo el intervalo [1,4], lee en [1,2] y [1,4] puede ser determinado después de que el [3,4], pero un conjunto diferente de tiempo realmente será ejecutado como en 3, 4. Pero cambió (0,2], y (2,4] no tiene este problema, esta vez la lectura [3,4] es equivalente a la búsqueda (2,4], 2, y 4 pertenecen a la misma serie.

código:

# include <cstdio> 
#include <cstring> 
using namespace std; 

const int maxN = 200 + 10; 
par int [maxN], v [maxN]; 
int n, m, xx, x, y, t, i, j; 

int find (int x) {//带权路径压缩
	si el retorno ([x] == x altura) x; 
	else { 
		int p = par [x]; 
		par [x] = encontrar (par [x]); 
		v [x] + = v [p]; 
		volver par [x]; 
	} 
} 

Int main () { 
	//freopen("hdu3038.txt","r",stdin); 
	mientras que (~ scanf ( "% d% d", y n, y m)) { 
		int ans = 0; 
		for (i = 0; i <= n; i ++) par [i] = i; 
		memset (v, 0, sizeof (v)); 
		for (i = 1; i <= m; i ++) { 
			scanf ( "% d% d% d", y xx, & Y, y t); 
			x = xx-1; // 
			int px = find (x);
			// si (px == py) { 
				int d = v [x] -v [y]; // ***
				if (! d = t) ans ++; 
			} 
			Else { 
				par [px] = PY; 
				v [px] = v [y] -v [x] + t; // *** 
			} 
		} 
		printf ( "% d \ n", ans); 
	} 
	// fclose (stdin); 
	return 0; 
}

 

  

hihocoder1515

enlaces a los temas: https://vjudge.net/problem/HihoCoder-1515

Problema de agua, sistema de v [x] representa la relación x x corriente nominal padre [x] bajo número de puntos en la línea (creo que reducir el número de puntos cómodas ......

código:

# include <cstdio> 
#include <cstring> 
using namespace std; 
const int maxN = 100 + 10; 
par int [maxN], v [maxN]; // v [x]表示x比par [x]低多少分
int s, n, m, q, t, i, j, x, y; 

int find (int x) { 
	si el retorno ([x] == x altura) x; 
	else { 
		int p = par [x]; 
		par [x] = encontrar (par [x]); 
		v [x] + = v [p]; 
		volver par [x]; 
	} 
} 

Int main () { 
	//freopen("hiho1515.txt","r",stdin); 
	scanf ( "% d% d% d", y n, y m, y q); 
	for (i = 1; i <= n; i ++) par [i] = i; 
	memset (v, 0, sizeof (v)); 
	for (i = 1; i <= m; i ++) { 
		scanf ( "% d% d% d", y x, y y, & s); s = -s; 
		int px = find (x); int py = find (y); 
		si (px!
		} 
	} 
	For (i = 1; i <= q; i ++) { 
		scanf ( "% d% d", y x, y y); 
		int px = find (x); int py = find (y); 
		if (! px = py) printf ( "- 1 \ n"); printf más ( "% d \ n", v [y] -v [x]); 
	} 
	// fclose (stdin); 
	return 0; 
}

  

cadena alimentaria poj1182

enlaces a los temas: https://vjudge.net/problem/POJ-1182

Esta cuestión debe ser considerada como un título clásico, sino también un pequeño cambio. Propia marca cerebro para una exitosa cabo get (sobre todo para ver las puntas en un modo de blog ...... 3)

Set v [x] = 0 y x representa PAR [x] es similar, v [x] = 1 x representa comer par [x], v [x ] = 2 x está representado PAR [x] comer. Al actualizar el código para hacer los cambios apropiados. En primer lugar, cuando se comprime camino v [x] = (v [ x] + v [p])% 3, dos a la derecha para encontrar el valores x e y de t, t = (v [x ] -v [y] 3 ) 3%, y el tercero se combina py px, buscando pesos entre px y la hora py, v [px] = (v [y] -v [x] + t + 3)% 3.

El código es:

# include <cstdio> 
#include <cstring> 
using namespace std; 
const int maxN = 500 + 10; 
par int [maxN], v [maxN]; // v [x] = 0: xºÍpar [x] ͬÀà v [x] = 1: x³Ôpar [x] v [x] = 2: x ± »par [x} ³Ô 
int t, i, j, k , n, m, d, x, y, ans; 

int find (int x) { 
	si el retorno ([x] == x altura) x; 
	else { 
		int p = par [x]; 
		par [x] = encontrar (par [x]); 
		v [x] = (v [p] + v [x])% 3; // * 
		retorno par [x]; 
	} 
} 

Int main () { 
	//freopen("poj1182.txt","r",stdin); 
	scanf ( "% d% d", y n, y k); 
	for (i = 1; i <= n; i ++) par [i] = i; 
	memset (v, 0, sizeof (v)); 
	ans = 0; 
	for (i = 1; i <= k; i ++) { 
		scanf ( "% d% d% d", y d, y x, y y);
		} 
		Int px = find (x); py = int encontrar (y); 
		si (px == py) { 
			t = (v [x] -v [y] 3)% 3; // * 
			si (d == 1 && t = 0) ans ++; 
			si (d == 2 && t = 1!) ans ++; 
		} 
		Else { 
			t = d-1; // * 
			par [px] = py; 
			v [px] = (v [y] -v [x] + t + 3)% 3; // * 
		} 
	} 
	printf ( "% d \ n", ans); 
	// fclose (stdin); 
	return 0; 
}

 

  

 

Supongo que te gusta

Origin www.cnblogs.com/edmunds/p/12524390.html
Recomendado
Clasificación