Et avec le bon ensemble de l'enquête préliminaire

Simple à apprendre un peu pondéré référence disjointe-ensemble ce blog, se sentent bien écrit: https://blog.csdn.net/yjr3426619/article/details/82315133

disjoint-RÉGL.GÉNÉRAUX et par rapport aux changements de code dans le chemin principal et le temps de compression de fusion. Poids entre [x] comme une ceinture de poids, le chemin du temps de compression pour mettre à jour le poids (typiquement V [x] est représenté par x et la valeur nominale, doit être mis à jour pour les coefficients de pondération entre la racine de x x valeur). Ensuite, lorsqu'il est combiné, pour trouver la racine px et py X et y est connecté à la py px (ou même px py) lorsque les deux poids doivent être calculés. Code de mise à jour et l'apparence comme le blog ci-dessus, parlent très clairement.

 

Les trois thèmes suivants enregistrés qu'il a réalisé le blog dans les exemples.

hdu 3038: sujet d' opinion Lien: https://vjudge.net/problem/HDU-3038

L'effet est de vous donner une série d'intervalles et de déterminer le nombre donné avant et contradictoire (si elle est contradictoire de sauter). Peut - être pondérée do disjointe-set: vu que les noeuds d'extrémité d' intervalle, les poids entre deux nœuds et vu dans cette plage. Étant donné les deux nœuds appartiennent à la même série de courant, et l'intervalle de celui - ci peut être déterminée, et détermine ensuite si oui ou égale à une valeur donnée, si pas égaux ans ++, sinon appartiennent à la même série, les mettre correspondant les racines ont été combinées, et le poids est déterminé entre deux racines. Le problème de base est le modèle, mais il y a un point à noter: Chaque fois que doit se lire comme point final gauche intervalle ouvert (-1 pour faire le point final à gauche). Exemple: Par exemple , l'intervalle [1,4], lue dans [1,2] et [1,4] peut être déterminé après la [3,4], mais un ensemble de temps différent sera effectivement exécuté comme dans 3, 4. Mais changé (0,2], et (2,4] n'a pas ce problème, cette lecture de temps [3,4] est équivalent à la recherche (2,4], 2 et 4 appartiennent au même ensemble.

code:

#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; 

trouver int (int x) {//带权路径压缩
	si (par [x] == x) return x; 
	else { 
		int p = par [x]; 
		par [x] = find (par [x]); 
		v [x] + = v [p]; 
		retour par [x]; 
	} 
} 

Int main () { 
	//freopen("hdu3038.txt","r",stdin); 
	tandis que (~ scanf ( "% d% d", et n, et 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", et xx, et y, t); 
			x = xx-1;  
			int px = find (x);
			// if (px == py) { 
				int j = 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

Liens Sujet: https://vjudge.net/problem/HihoCoder-1515

problème de l'eau, ensemble v [x] représente le rapport x x par père actuel [x] faible nombre de points sur la ligne (je pense que réduire le nombre de points confortables ......

code:

#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; 

trouver int (int x) { 
	if (par [x] == x) return x; 
	else { 
		int p = par [x]; 
		par [x] = find (par [x]); 
		v [x] + = v [p]; 
		retour par [x]; 
	} 
} 

Int main () { 
	//freopen("hiho1515.txt","r",stdin); 
	scanf ( "% d% d% d", et n, et m, et 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", et x, y, & & s); s = -s; 
		int px = trouver (x); int py = trouver (y); 
		si (px!
		} 
	} 
	For (i = 1; i <= q; i ++) { 
		scanf ( "% d% d", et x, et y); 
		int px = trouver (x); int py = trouver (y); 
		if (! px = py) printf ( "- 1 \ n"); else printf ( "% d \ n", v [y] -v [x]); 
	} 
	// fclose (stdin); 
	return 0; 
}

  

chaîne alimentaire poj1182

Liens Sujet: https://vjudge.net/problem/POJ-1182

Cette question doit être considérée comme un titre classique, mais aussi un peu de changement. Propre marque de cerveau pour un succès à get (principalement pour voir les conseils en mode blog 3 ......)

Set v [x] = 0 et x représente PAR [x] est similaire, v [x] = 1 x représente manger par [x], v [x ] = 2 x est représenté par [x] manger. Lors de la mise à jour du code pour faire les changements appropriés. En premier lieu , lorsque le chemin v comprimé [x] = (v [ x] + v [p])% 3, deux pour trouver les valeurs x et y de t, t = (v [x ] -v [y] 3 ) 3%, et le troisième est combiné px py, à la recherche des poids entre px et py temps, v [px] = (v [y] -v [x] + t + 3)% 3.

Le code il:

#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; 

trouver int (int x) { 
	if (par [x] == x) return x; 
	else { 
		int p = par [x]; 
		par [x] = find (par [x]); 
		v [x] = (v [p] + v [x])% 3; // * 
		par retour [x]; 
	} 
} 

Int main () { 
	//freopen("poj1182.txt","r",stdin); 
	scanf ( "% d% d", et n, et 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", et d, et x, et y);
		    ans ++; continuer;	
		} 
		Int px = find (x); int py = find (y); 
		if (px == py) { 
			t = (v [x] -v [y] 3) 3%; // * 
			if (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; 
}

 

  

 

Je suppose que tu aimes

Origine www.cnblogs.com/edmunds/p/12524390.html
conseillé
Classement