Автор: Пользователь скрыл имя, 14 Февраля 2012 в 10:13, лабораторная работа
При проектировании железных дорог, линий электропередачи и других линий коммуникации возникает проблема построения сети с минимальными затратами. В теории графов такая задача может решается путем построения минимального остовного дерева неориентированного графа. Данная задача имеет несколько методов решения. Один из них – алгоритм Прима.
Введение 3
Постановка задачи 4
Руководство пользователя 5
Руководство программиста 6
Описание структур данных 6
Описание алгоритмов 6
Описание структуры программы 6
Заключение 7
Литература 8
//добавление
и удаление элемента из
void InsElem(int n);
void DelElem( int n);
int IsMember(int n);
int operator ==(TSet &s);
//операции над множествами
TSet & operator=(TSet &s);
TSet operator+(int n);
TSet operator-(int n);
TSet operator+(TSet &s);
TSet operator*(TSet &s);
TSet operator~(void);
//дружественные функции
friend istream &operator>>(istream &istr,TSet &bf);
friend ostream &operator<<(ostream &ostr, TSet &bf);
};
Реализация
классов описывается в TBitFiie
Описание алгоритма Прима
Пусть V = {1, 2, …, n} – множество вершин графа G = (V, E). Построим множество U, из которого будет вырастать остовное дерево. Сначала положим U = {1} (остов начинает строиться с первой вершины). На каждом шаге алгоритма находится ребро наименьшей стоимости (u, v) такое, что u принадлежит U и v принадлежит V \ U, после чего вершина v переносится из множества V \ U в U. Этот процесс продолжается до тех пор, пока множество U не станет равным V.
Рассмотрим
реализацию алгоритма Прима. Массив
a[i][j] содержит матрицу весов графа. Цикл
по i продолжается n – 1 раз, на каждой
его итерации ко множеству U добавляется
одна вершина (p - ая). В цикле по j
перебираются вершины из U,– из V \ U. Таким
образом ищется реберо (i, j) наименьшей
длины len.
u.InsElem(1); // присваиваем множеству u первую вершину
for(i = 0; i < n; i++){
len=200000000;
for(j = 0; j < n; j++){
if ( ( u.IsMember(j)) &&
((u+(~v)).IsMember(i)))//
{if((i=j)||(a[i][j]=0)) continue;
//поиск минимального ребра
if(a[i][j]<len) len=a[i][j];}
c.InsElem(a[i][j]); //заполняем множество ребер
v.DelElem(j); //исключаем конечную вершину из множества v
u.InsElem(j); }} //добавляем конечную вершину в множество u
//заводим
массив для новой матрицы
b = new int *[n];
for(i=0;i<n;i++){
b[i] = new int [n];
for(j=0;j<n;j++){
if(c.IsMember(a[i][j])){
b[i][j]=a[i][j];}
else b[i][j]=0;}}
В ходе проделанной работы была написана программа, реализующая алгоритм Прима.
Для работы с графом реализован класс, использующий одно из следующих представлений графа: матрица смежности. После завершения работы алгоритма Прима с выбранной реализацией, выводится матрица смежности минимального остовного дерева. Происходит выполнение операции обновления данных.
Пользователь
задает граф вручную, с помощью таблицы
смежности dataGridView. Программа визуально
отображает граф и выделяет цветом вершины,
входящие в полученное минимальное остовное
дерево.
Информация о работе Реализация алгоритма Прима c использованием множеств