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