algoritmo Kruscal implementado en C ++

 

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

 

Supongo que te gusta

Origin www.cnblogs.com/FdWzy/p/12595136.html
Recomendado
Clasificación