Что такое Испанское дерево?

При неориентированном и связанном с ним графике,G=( V,E) обходное дерево графика – это дерево G, имеющее диапазон G (т.е. включающее в себя каждую вершину) и являющееся подграфом (каждому ребру в дереве отведено место).

Что такое “Base Spanning Tree”?

Затраты на обход дерева – это совокупность нагрузок на значительное количество кромок дерева. На дерево может попасть много кромок. Наименьшим из пересекающихся деревьев является пересекающее дерево, где расход меньше всего из всех разбрасываний по деревьям. На деревьях также может быть много оснований.

Наименьшее распространение по дереву имеет прямое применение в плане систем. Он используется в расчетах, приближенных к выпуску репертуара по продажам в путешествии, многотерминального наименьшего среза и наименьшего взвешенного безукоризненного согласования. Другие функциональные возможности применения:

Групповое расследование

Признание почерка

Подразделение фотографий

Расчёт Крускаля

Kruskal’s Calculation производит распределение по дереву путем включения кромок по отдельности в развивающееся пересекающееся дерево. Крускальская методика расчетов использует очень простую методику, так как в каждом цикле она находит кромку, которая имеет наименьший вес, и добавляет ее к развивающемуся распределению по дереву.

Шаги КаАлгоритма:

Сортируйте края графа по их весу.

Начните добавлять края в MST от края с наименьшим весом до края с наибольшим весом.

Добавляйте только те кромки, которые не образуют цикл, кромки, которые соединяют только отсоединенные компоненты.

 Итак, теперь вопрос в том, как проверить, связаны ли вершины или нет?

Это должно быть возможно при использовании DFS, которая начинается с главной вершины, на этом этапе проверяется, посещается ли последующая вершина или нет. Тем не менее, DFS сделает время замысловатым огромным, так как имеет запрос на то, где находится количество вершин, есть количество рёбер. Поэтому лучшее расположение – “Disjoint Sets”:

Разобщенные множества будут множествами, конвергенция которых является незаполненным множеством, так что это подразумевает, что они не разделяют ни одного компонента для всех намерений и целей.

В расчетах Крускала, в каждом цикле мы будем выбирать кромку с наибольшим снижением веса. В соответствии с этим мы начнем с наиболее уменьшенного веса кромки, т.е. кромки с весом 1. После этого выберем вторую наиболее утяжеленную кромку, т.е. кромку с весом 2. Обратите внимание, что эти две кромки абсолютно разделены. В настоящее время следующая кромка будет третьей по величине утяжеленной кромкой, т.е. кромкой с весом 3, которая ассоциирует два дискретных бита диаграммы. В настоящее время нам не разрешается подбирать кромку с весом 4, которая сделает цикл, и мы не можем иметь никаких циклов. Поэтому мы выберем пятую наименее утяжеленную кромку, т.е. кромку с весом 5. В настоящее время две другие кромки будут делать циклы, поэтому мы не будем обращать на них внимание. В конце концов, мы получим дерево-основатель с полной стоимостью 11 ( = 1 + 2 + 3 + 5).

#include <iostream>

#include <vector>

#Включая <полезность>

#include <алгоритм>

используя пространство имён std;

const int MAX = 1e4 + 5;

int id[MAX], узлы, края;

пара < long long, pair< int, int> > p[MAX];

void initialize()

{

    for(int i = 0;i < MAX;++i)

        id[i] = i;

}

int root(int x)

{

    пока(id[x] != x)

    {

        id[x] = id[id[x]];

        x = id[x];

    }

    вернуть икс;

}

void union1(int x, int y)

{

    int p = root(x);

    int q = root(y);

    id[p] = id[q];

}

long long kruskal(pair< long long, pair< int, int> > p[])

{

    Внутри и снаружи;

    длинная длинная стоимость, минимальная стоимость = 0;

    for(int i = 0;i <края;++i)

    {

        // Выбор краев по очереди в порядке возрастания от начала.

        x = p[i]. Второе. Первое;

        y = p[i]. секундочку. секундочку;

        Стоимость = p[i]. Сначала;

        // Проверьте, создает ли выбранный край цикл или нет.

        if(root(x) != root(y))

        {

            минимальная стоимость += стоимость;

            Union1(x, y);

        }    

    }

    минимальная стоимость возврата;

}

int main()

{

    Внутри и снаружи;

    длинный длинный вес, стоимость, минимальная стоимость;

    инициализировать();

    cin >> узлы >> края;

    for(int i = 0;i <края;++i)

    {

        cin >> x >> y >> вес;

        p[i] = make_pair(вес, make_pair(x, y));

    }

    // Сортируйте края в порядке возрастания/

    sort(p, p + края);

    minimumCost = kruskal(p);

    << минимальная стоимость << эндл;

    вернуть 0;

}

алгоритм Прима

Prim’s Calculation также использует Covetous способ определения местонахождения дерева, проходящего через основание. В Demure’s Calculation мы становимся пересекающим деревом из начальной позиции. В отличие от края в Крускале, мы добавляем вершину к развивающемуся распределению по дереву в Prim’е.

Шаги расчета:

Держите два разрозненных расположения вершин. Одна из них содержит вершины, которые находятся в развивающемся распаде на дерево, а другая – не в развивающемся перекрещивающемся дереве.

Выберите наименее дорогую вершину, которая ассоциируется с развивающимся перекрещивающим деревом и не находится в развивающемся перекрещивающем дереве, и включите ее в развивающееся перекрещивающее дерево. Это должно быть возможно при использовании Линий Потребности. Дополните вершины, связанные с развивающимся пересекающим деревом, в Линию потребностей.

Проверьте циклы. Для этого отметьте те концентраторы, которые были выбраны на данный момент, и добавьте только те концентраторы в Линии потребностей, которые не проверяются.

В Расчете Прима мы начнем с дискреционного хаба (не имеет значения, какой именно) и напечатаем его. В каждом цикле мы будем проверять другую вершину, соседнюю с только что отпечатанной. В качестве жадного расчета Demure выберет наименее дорогой край и отпечатает вершину. Таким образом, мы в основном выберем вершину с весом 1. В следующем цикле у нас есть три варианта, вершины с весом 2, 3 и 4. Таким образом, мы выберем край с весом 2 и отпечатаем вершину. В настоящее время у нас снова есть три варианта, рёбра с весом 3, 4 и 5. Тем не менее, мы не можем выбрать кромку с весом 3, так как она делает цикл. Таким образом, мы выберем кромку с весом 4 и закончим с базовым деревом пересечения абсолютной стоимости 7 ( = 1 + 2 + 4).

Осуществление:

#include <iostream>

#include <vector>

#include <queue>

#Включая <функциональный>

#Включая <полезность>

используя пространство имён std;

const int MAX = 1e4 + 5;

Пара typedef< long long, int> PII;

шерсть с маркировкой[MAX];

вектор < PII> adj[MAX];

длинная прима(int x)

{

    priority_queue< PII, vector< PII>, greater< PII> > Q;

    внутри тебя;

    длинный длинный минимумЗатраты = 0;

    ПИИ п;

    Q. push(make_pair(0, x));

    while(! Q. empty())

    {

        // Выберите кромку с минимальным весом

        p = Q. top();

        Q. pop();

        x = p. second;

        // Проверка цикла

        if(marked[x] == true)

            Продолжай;

        Минимальная стоимость += p. первой;

        помечено[x] = true;

        for(int i = 0;i < adj[x]. size();++i).

        {

            y = adj[x][i]. Секундочку;

            if(marked[y] == false)

                Q. push(adj[x][i]);

        }

    }

    минимальная стоимость возврата;

}

int main()

{

    int узлы, края, x, y;

    длинный длинный вес, минимальная стоимость;

    cin >> узлы >> края;

    for(int i = 0;i <края;++i)

    {

        cin >> x >> y >> вес;

        adj[x]. push_back(make_pair(вес, y));

        adj[y]. push_back(make_pair(вес, x));

    }

    // Выбор 1 в качестве стартового узла

    minimumCost = prim(1);

    << минимальная стоимость << эндл;

    вернуть 0;

}