Principio: Usando el algoritmo voraz. En primer lugar de todos los bordes de acuerdo con el peso en orden ascendente, cada uno de los punto inicial es un árbol (un nodo de árbol). Después de atravesar el borde frontal del colector de corriente, el borde xy actual, si x, y en nuestra ya en el árbol de expansión mínima, omita este borde.
Si las x, y no tiene al menos un árbol de expansión mínima en nuestra, mientras que la adición del árbol de expansión mínima, y el árbol que contiene X e Y se fusionaron en un árbol que comprende un árbol. (Y el uso de la operación diferencia conjunto combinado se completa)
Nota: El código no verifica la exactitud!
// Kruscal算法2020年3月29日21:41:19 // --------------------------------- - vector < int > padre; // 并差集 vacío de combinación ( int x, int y) { int x_father = get_father (x), y_father = get_father (y); padre [x] = y_father; } Int get_father ( int x) { si (padre [x] =! X) { retorno padre [x] = get_father (padre [x]); } Retorno x; } // ----------------------------------- struct Edge // el lado derecho { int Point1; int Point2; int Pesar; Edge ( int X, int Y, int Z): Point1 (X), Point2 (Y), Pesar (Z) {} }; // - ---------------------------------- // encontrar el borde derecho ponderada grafo no dirigido y el MST int Kruscal ( ) { int puntos; // puntos: los puntos de COUT << " número de puntos de entrada: " << endl; CIN >> puntos; father.resize (puntos); para ( int= I 0 ; i <Puntos; ++ I) { Padre [I] = I; } Vector <Edge> Bordes; // Edges: establecer el lado derecho de la int R ^, S, T; el mientras que (R & lt CIN >>> > S >> T) { edges.emplace_back (R & lt, S, T); } Sort (edges.begin (), edges.end (), [] ( const Edge A &, const Edge & B) { retorno a.weigh < b.weigh;}); // de acuerdo con pequeñas a grandes peso int RES; // derecha y MST int edge_cnt = 0 ; // han elegido el número de lados de (const Auto & Edge: Bordes) { int P1 = edge.point1, P2 = edge.point2; SI (Padre [P1] == Padre [P2]) { // P1, P2 se ha unido al MST Continuar ; } RES + = Edge. Pesar; // esto se añade con MST ++ edge_cnt; merge (P1, P2); // fusionar los dos puntos IF (edge_cnt> = puntos- 1. ) { // número de borde es -1 punto, completó la construcción de la MST PAUSA ; } } retorno RES; }