Алгоритм Краскала

Рассмотрение алгоритма построения минимального остовного дерева взвешенного связного неориентированного графа. Описание, псевдокод и блок-схема алгоритма Краскала. Код программы и сложность алгоритма. Описание, псевдокод и сложность алгоритма Прима.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 25.04.2015
Размер файла 160,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

1

Алгоритм Краскала

Реферат

Отчет 25 с., 19 рис., 4 источников.

АЛГОРИТМ, ГРАФ, РЕБРО, ВЕРШИНА, ОСТОВНОЕ ДЕРЕВО, ПСЕВДОКОД, БЛОКСХЕМА, РЕАЛИЗАЦИЯ.

Объект исследования: алгоритм Краскала

Цель работы: закрепление знаний и умений, полученных в процессе теоретического обучения.

Метод работы: закрепление теоретических знаний с помощью разработки программы, реализующий данный алгоритм.

Содержание

Введение

1. Алгоритм Краскала

1.1 Описание алгоритма Краскала

1.2 Псевдокод алгоритма

1.3 Блок-схема алгоритма

1.4 Код программы

1.5 Сложность алгоритма

2. Алгоритм Прима

2.1 Описание алгоритма Прима

2.2 Псевдокод алгоритма

2.3 Блок-схема алгоритма

2.4 Код программы

2.5 Сложность алгоритма

Заключение

Список использованных источников

аглоритм краскал прим псевдокод

Введение

Объектом исследования курсовой работы стала реализация алгоритма Краскалы.

Целями работы являлись:

1) ознакомление с алгоритмом Краскалы, его историей;

2) реализация алгоритма, для построения минимального оставного дерева;

3) анализ трудоёмкости алгоритма;

4) тестирование алгоритма.

Минимальным остовным деревом (МОД) связного взвешенного графа называется его связный подграф, состоящий из всех вершин исходного дерева и некоторых его ребер, причем сумма весов ребер максимально возможная. Если исходный граф несвязен, то описываемую ниже процедуру можно применять поочередно к каждой его компоненте связности, получая тем самым минимальные остовные деревья для этих компонент.

Алгоритм Краскала(или алгоритм Крускала) - алгоритм построения минимального отовного дерева взвешенного связного неориентированного графа. Алгоритм впервые описан Джозефом Крускалом в 1956 году.

Алгоритм Краскала может строить дерево одновременно для нескольких компонент связности, которые в процессе решения объединяются в одно связанное дерево.

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

Задача о нахождении минимального остовного дерева часто встречается в подобной постановке: есть n городов, через которые можно проложить маршрут так, чтобы можно было добраться из любого города в любой другой (напрямую или через другие города). Требуется найти такой маршрут, чтобы стоимость проезда была максимальной.

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

Алгоритм Прима -- алгоритм построения минимального остовного дерева взвешенного связного неориентированного графа. Алгоритм впервые был открыт в 1930 году чешским математиком Войцехом Ярником, позже переоткрыт Робертом Примом в 1957 году, и, независимо от них, Э. Дейкстрой в 1959 году.

Построение начинается с дерева, включающего в себя одну (произвольную) вершину. В течение работы алгоритма дерево разрастается, пока не охватит все вершины исходного графа. На каждом шаге алгоритма к текущему дереву присоединяется самое лёгкое из рёбер, соединяющих вершину из построенного дерева и вершину не из дерева.

1. Алгоритм Краскала

1.1 Описание алгоритма Краскала

Формулировка.

Вначале текущее множество рёбер устанавливается пустым. Затем, пока это возможно, проводится следующая операция: из всех рёбер, добавление которых к уже имеющемуся множеству не вызовет появление в нём цикла, выбирается ребро минимального веса и добавляется к уже имеющемуся множеству. Когда таких рёбер больше нет, алгоритм завершён. Подграф данного графа, содержащий все его вершины и найденное множество рёбер, является его остовным деревом минимального веса.

Алгоритм состоит из следующей последовательности действий:

1. Создается список ребер E, содержащий длину ребра, номер исходной вершины ребра (i), номер конечной вершины ребра (j), признак включения данного ребра в дерево.

2. Данный список упорядочивается в порядке возрастания длин ребер.

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

4. Если все вершины включены в дерево и количество ребер на единицу меньше количества вершин, то алгоритм свою работу закончил. В противном случае осуществляется возврат к пункту 3.

1.2 Псевдокод алгоритма

Отсортировать ребра в порядке возрастания весов

инициализировать структуру разбиений

edgeCount=l

while edgeCount<=E and includedCount<=М-l do

parentl=FindRoot(edge[edgeCount].start)

parent2=FindRoot(edge[edgeCount].end)

if parentl/=parent2 then

добавить edge[edgeCount] в остовное дерево

includedCount=includedCount=l

Union(parent1,parent2)

end if

edgeCount=edgeCount+l

end while.

E - число ребер в графе;

V - число вершин в графе

edgeCount - переменная;

includedCount - переменная;

Parent - массив, в котором под каждый элемент множества, с которым мы собираемся работать, отведена одна ячейка;

FindRoot(x) - (x элемент, для которого мы хотим найти корень части, его содержащей) процедура, начинающая с ячейки Parent [x], в которой хранится номер непосредственного предка элемента x;

Union - функция, выполняющая объединение двух частей в одну.

1.3 Блок-схема алгоритма

На рисунке 1 представлена общая схема алгоритма.

Размещено на http://www.allbest.ru/

1

Рисунок 1 Общая схема

На рисунке 2 представлена блок-схема алгоритма сортировки вставками.

Размещено на http://www.allbest.ru/

1

Рисунок 2 Блок-схема алгоритма сортировки вставками

На рисунке 3 представлена блоксхема алгоритма Краскала

Размещено на http://www.allbest.ru/

1

Рисунок 3 Блоксхема алгоритма Краскала

1.5 Сложность алгоритма

Сложность этого алгоритма совпадает со сложностью используемоего алгоритма сортировки, поскольку число операций в цикле while линейно по числу ребер. Поэтому сложность алгоритма Крускала поиска МОД равна O(E\og Е).

2. Алгоритм Прима

2.1 Описание алгоритма Прима

Описание.

Сам алгоритм имеет очень простой вид. Искомый минимальный остов строится постепенно, добавлением в него рёбер по одному. Изначально остов полагается состоящим из единственной вершины (её можно выбрать произвольно). Затем выбирается ребро минимального веса, исходящее из этой вершины, и добавляется в минимальный остов. После этого остов содержит уже две вершины, и теперь ищется и добавляется ребро минимального веса, имеющее один конец в одной из двух выбранных вершин, а другой -- наоборот, во всех остальных, кроме этих двух. И так далее, т.е. всякий раз ищется минимальное по весу ребро, один конец которого -- уже взятая в остов вершина, а другой конец -- ещё не взятая, и это ребро добавляется в остов (если таких рёбер несколько, можно взять любое). Этот процесс повторяется до тех пор, пока остов не станет содержать все вершины (или, что то же самое, n-1 ребро).

В итоге будет построен остов, являющийся минимальным. Если граф был изначально не связен, то остов найден не будет (количество выбранных рёбер останется меньше n-1).

Вход : Связный неориентированный граф G(V,E)

Выход : Множество T рёбер минимального остовного дерева

Алгоритм.

· Множество остовных вершин - исходная вершины

· Множество оставшихся - все вершины за исключением исходной

· Пока множество оставшихся не пусто:

o Ищем ребро соединяющее множество остовных и множество оставшихся и имеющее наименьший вес

o Для найденного ребра, вершину принадлежащую множеству оставшихся:

· Вычеркиваем из множества оставшихся.

· Добавляем к множеству остовных.

выбрать начальный узел

сформировать начальную кайму, состоящую из вершин,

соседних с начальным узлом

while в графе есть вершины, не попавшие в дерево do

выбрать ребро из дерева в кайму с наименьшим весом

добавить конец ребра к дереву

изменить кайму, для чего

добавить в кайму вершины, соседние с новой

обновить список ребер из дерева в кайму так,

чтобы он состоял из ребер наименьшего веса

end while

2.2 Псевдокод алгоритма

MST_PRIM(G, w, r)

1 for (Для) каждой вершины u є V[G]

2 do key [u] «- INFINITY

3 prev[u] «- NIL

4 key[r] «- 0

5 Q «- V[G]

6 while Q не пустая

7 do u «- Extract_Min(Q)

8 for (Для) каждой вершины v є Adj[u]

9 do if v є Q и w(u,v) < key[v]

10 then prev[v] «- u

11 key[v] «- w(u, v)

2.3 Блок-схема алгоритма

Размещено на http://www.allbest.ru/

1

Размещено на http://www.allbest.ru/

1

Размещено на http://www.allbest.ru/

1

Размещено на http://www.allbest.ru/

1

Размещено на http://www.allbest.ru/

1

Размещено на http://www.allbest.ru/

1

2.4 Код программы

#include <iostream>

#include <vector>

#include <iomanip>

#define forn(i,n) for(int i=0;i<n;i++)

using namespace std;

int n,m;

vector <pair<int,int>> g[500];//кроме вершин список смежности хранит и вес ребра

vector <bool> used(500,0);//вектор использованных вершин

int inf=10000000;

vector <int> d(500,inf);//вектор расстояний

int main()

{

freopen("input.txt","rt",stdin);

freopen("output.txt","wt",stdout);

cin>>n>>m;

int x,y,l;

pair <int,int> temp;

forn(i,m){

cin>>x>>y>>l;

x--;

y--;

temp.first=y;

temp.second=l;

g[x].push_back(temp);

temp.first=x;

g[y].push_back(temp);

}

vector <pair<int,int>> path(500);

d[0]=0;

while(true){

int v=-1;

int dist=inf;

forn(u,n)

if(!used[u] && dist>=d[u])

{

v=u;

dist=d[u];

}

if (v==-1) break;

used[v]=true;

forn(u,g[v].size())

if(!used[g[v][u].first]) {

if (d[g[v][u].first]>g[v][u].second) path[g[v][u].first]=make_pair(v,g[v][u].first);

d[g[v][u].first]=min(d[g[v][u].first],g[v][u].second);

}

}

long long sum=0;

forn(i,n) sum+=d[i];

cout<<sum<<endl;

forn(i,n-1)

cout<<path[i+1].first+1<<" "<<path[i+1].second+1<<endl;

return 0;

}

2.5 Оценка сложности

Время работы алгоритма Прима зависит от выбранной реализации очереди с приоритетами Q. Если реализовать ее как бинарную пирамиду, то для выполнения инициализации в строках 1-5 потребуется времени О (V). Тело цикла while выполняется |V| раз, а поскольку каждая операция Extract_Min занимает время О (lg V), общее время всех вызовов процедур Extract__Min составляет О (V*lg V). Цикл for в строках 8-11 выполняется всего О (Е) раз, поскольку сумма длин всех списков смежности равна 2|Е|. Внутри цикла for проверка на принадлежность Q в строке 9 может быть реализована за постоянное время, если воспользоваться для каждой вершины битом, указывающим, находится ли она в Q, и обновлять этот бит при удалении вершины из Q. Присвоение в строке 11 неявно включает операцию Decrease_Key над пирамидой. Время выполнения этой операции -- О (lg V). Таким образом, общее время работы алгоритма Прима составляет o(V * lg V + Е * lg V) = o(Е * lg V), что асимптотически совпадает со временем работы алгоритма Крускала.

Заключение

В курсовом проекте был изучен алгоритм Краскала. Рассмотрены блок-схема, псевдокод данного алгоритма. Разработана программа, реализующая алгоритм Краскала, поиск минимального остовного дерева. Изучен алгоритм Прима.

Список использованных источников

1. Свободная энциклопедия ВикипедиЯ [Электронный ресурс]. Режим доступа: http://ru.wikipedia.org/. Загл. с экрана.

2. Решетов Ю.А. Алгоритмы, методы, исходники, 2012.

3. Макконелл Дж. Основы современных алгоритмов: 2-е дополненное издание М.: Техносфера, 2010. 368 с. ISBN 5-94836-005-9.

4. [Электронный ресурс]. Режим доступа: http://www.lotos-khv.narod.ru/. Загл. с экрана.

Размещено на Allbest.ru

...

Подобные документы

  • Реализация алгоритмов Краскала и Прима для построения минимального остовного дерева взвешенного связного неориентированного графа. Анализ трудоемкости алгоритмов, их псевдокоды и тестирование. Применение алгоритма Краскала на практике в работе авиалиний.

    курсовая работа [142,0 K], добавлен 25.12.2012

  • Способы построения остовного дерева (алгоритма поиска в глубину и поиска в ширину). Вид неориентированного графа. Понятие и алгоритмы нахождения минимальных остовных деревьев. Последовательность построения дерева графов по алгоритмам Крускала и Прима.

    презентация [22,8 K], добавлен 16.09.2013

  • Блок-схема алгоритма Флойда. Разработка его псевдокода в программе Microsoft Visual Studio. Программа реализации алгоритмов Беллмана-Форда. Анализ трудоемкости роста функции. Протокол тестирования правильности работы программы по алгоритму Флойда.

    курсовая работа [653,5 K], добавлен 18.02.2013

  • Изучение понятия и свойств алгоритма. Определение сущности технологии Robson. Исполнитель, а также блок-схема алгоритма или его графическое представление, в котором он изображается в виде последовательности связанных между собой функциональных блоков.

    реферат [155,9 K], добавлен 19.10.2013

  • Понятие и свойства алгоритма, виды, характеристики. Роль алгоритма в построении программы, представление и запись. Словесный, графический, табличный способ. Псевдокод. Примеры известных алгоритмов. Операции над массивами. Уточнение корней уравнения.

    курсовая работа [1,1 M], добавлен 10.11.2016

  • Общее понятие алгоритма и меры его сложности. Временная и емкостная сложность алгоритмов. Основные методы и приемы анализа сложности. Оптимизация, связанная с выбором метода построения алгоритма и с выбором методов представления данных в программе.

    реферат [90,6 K], добавлен 27.11.2012

  • Описание принципа работы генетического алгоритма, проверка его работы на функции согласно варианту на основе готовой программы. Основные параметры генетического алгоритма, его структура и содержание. Способы реализации алгоритма и его компонентов.

    лабораторная работа [20,2 K], добавлен 03.12.2014

  • Разработка алгоритма решения задачи численного интегрирования методом трапеции. Словесное описание и блок-схема разработанного алгоритма программы. Описание интерфейса, главного окна и основных форм программы. Проверка работоспособности программы.

    курсовая работа [1,4 M], добавлен 16.03.2012

  • Основные свойства алгоритма. Формальный и неформальный исполнитель алгоритма, система его команд. Способы записи алгоритма. Словесное описание, построчная запись, опорный конспект. Характеристики алгоритмического языка. Выполнение алгоритма компьютером.

    презентация [2,0 M], добавлен 04.04.2014

  • История создания алгоритма Форда-Фалкерсона, краткое описание его алгоритма, особенности работы, анализ сложности. Создание распараллеленного варианта алгоритма и его краткое описание. Основные характеристики теории графов, специфика, пути и маршруты.

    контрольная работа [246,3 K], добавлен 06.08.2013

  • Примерный вид выходного сигнала датчика. Описание и блок-схема алгоритма обработчиков прерываний. Формула вычисления температуры на индикаторе. Перевод абсолютного значения в BCD-код. Блок-схема алгоритма основной программы. Динамическая индикация.

    курсовая работа [141,2 K], добавлен 21.10.2012

  • Общее понятие графа, его виды и сущность вершинного покрытия. Написание точного алгоритма решения задачи о надежности сети, нахождение минимального покрытия. Реализация данного алгоритма на языке TurboC++. Код программы, решающий поставленную задачу.

    курсовая работа [1,3 M], добавлен 27.06.2014

  • Описание алгоритма работы и разработка структурной схемы МКС. Схема вывода аналогового управляющего сигнала, подключения ЖК-дисплея, клавиатуры и аварийного датчика. Разработка блок-схемы алгоритма главной программы работы МКС. Функция инициализации.

    курсовая работа [5,7 M], добавлен 26.06.2016

  • Основные понятия и определения теории графов: теоремы и способы задания графа, сильная связность графов. Построение блок-схем алгоритма, тестирование разработанного программного обеспечения, подбор тестовых данных, анализ и исправление ошибок программы.

    курсовая работа [525,6 K], добавлен 14.07.2012

  • Элементы и переменные, используемые для составления записи в Паскале. Основные числовые типы языка Turbo Pascal. Составление блок-схемы приложения, программирование по ней программы для вычисления функции. Последовательность выполнения алгоритма.

    лабораторная работа [256,9 K], добавлен 10.11.2015

  • Основные принципы функционирования ПК. Определение конфигурации компьютера с требуемыми характеристиками. Характеристики основных компонентов современного ПК. Описание алгоритма решения задачи с использованием MS Excel. Блок-схема алгоритма решения задач.

    курсовая работа [3,5 M], добавлен 20.12.2010

  • Понятие алгоритма, его свойства. Дискретность, определенность, результативность, формальность как свойства алгоритма. Программа как описание структуры алгоритма на языке алгоритмического программирования. Основные структурные алгоритмические конструкции.

    реферат [1,3 M], добавлен 18.11.2010

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

    курсовая работа [1,1 M], добавлен 11.01.2015

  • Основные аналитические соотношения. Блок схемы и алгоритм решения задачи. Проверка работоспособности алгоритма вручную. Таблица идентификации переменных. Формы входной и выходной печати. Разработка и отладка программы. Инструкция для работы с программой.

    курсовая работа [69,8 K], добавлен 13.02.2012

  • Этапы процедуры принятия решений. Разработка математического алгоритма. Блок-схема алгоритма работы программы. Разработка программы на языке программирования С++ в среде разработки MFC. Текст программы определения технического состояния станка с ЧПУ.

    курсовая работа [823,0 K], добавлен 18.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.