Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2011, 20:49   #1
FranZuZ
 
Регистрация: 20.12.2009
Сообщений: 6
По умолчанию "Минимальное остовное дерево. Алгоритм Прима"

Может кто помочь с такой программой? Есть код другой программы(Алгоритм Краскала) - это в принципе схожий с алгоритмом Прима, но немного по другому, и есть сам алгоритм Прима, можно ли как то совместить эти 2 программы и чтобы все работало. Помогите, буду очень признателен.
Нахождение минимального остовного дерева. Алгоритм Краскала.
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
// -------------------------------------------
typedef int* tint; // указатель на int
void main ()
{ // int max=100; // Максимальный вес ребра
int n; // количество вершин
tint* G; // исходный граф
tint* H; // матрица списка ребер с весом
tint* K; /*матрица, отмечающая принадлежность
вершины компоненте*/
tint* T; // матрица остовного дерева
tint* L; // список ребер с ценами минимального дерева
// -----ввод графа
int max;
cout<<" Maximalno dopustimoe zna4enie vesa rebra = ";
cin>> max;
cout<<"\n Vvedite 4ilo vershin: \n ";
cin>> n;
G=new tint [n];
for (int i=0; i<n; i++)
G [i] =new int [n];
cout<<" Vvedite nignij treugolnik matrici stoimosti: \n ";
for (int i=1; i<n; i++)
for (int j=0; j<i; j++) {
cin>> G [i] [j];
}
for (int i=1; i<n; i++)
for (int j=0; j<i; j++)
G [j] [i] =G [i] [j];
// ---выделение памяти для списка ребер---
int kolreb=0;
for (int i=1; i<n; i++)
for (int j=0; j<i; j++)
if (G[i][j]<max&&G[i][j]!=0)
kolreb++;
H=new tint [kolreb];
for (int i=0; i<kolreb; i++)
H [i] =new int [3];
// -------------------------------------------
int a=0;
for (int i=1; i<n; i++)
for (int j=0; j<i; j++)
if (G[i][j]<max&&G[i][j]!=0){
H [a] [0] =i+1;
H [a] [1] =j+1;
H [a] [2] =G [i] [j];
a++;
}
cout<<endl;
// ----сортировка ребер по возрастанию веса
int f,d,s;
for (int i=0; i<kolreb-1; i++)
for (int j=0; j<kolreb-1; j++)
if (H [j] [2] <H [j+1] [2]) {
f=H [j] [2];
H [j] [2] =H [j+1] [2];
H [j+1] [2] =f;
d=H [j] [0];
H [j] [0] =H [j+1] [0];
H [j+1] [0] =d;
s=H [j] [1];
H [j] [1] =H [j+1] [1];
H [j+1] [1] =s;
}
// вывод ребер отсортированных по возрастанию веса
cout<<"Matrica dostigimosni otsortirovannoe po ubivaniuy: \n ";
for (int i=0; i<kolreb; i++) {
cout<<H [i] [0] <<"-->";
cout<<H [i] [1] <<" = ";
cout<<H [i] [2] <<endl;
cout<<" ";
}
for (int i=0; i<kolreb; i++) {
H[i][0]--;
H[i][1]--;
}
// матрица для определения компоненты
K=new tint [n];
for (int i=0; i<n; i++)
K [i] =new int [2];
for (int i=0; i<n; i++) {
K [i] [0] =i;
K [i] [1] =0;
}
// ----матрица остовного дерева
T=new tint [n];
for (int i=0; i<n; i++)
T [i] =new int [n];
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
T [i] [j] =0;
// -присоединение первого ребра
T [H [0] [0]] [H [0] [1]] =H [0] [2];
T [H [0] [1]] [H [0] [0]] =H [0] [2];
K [H [0] [0]] [1] =1;
K [H [0] [1]] [1] =1;
// алгорит соединения ребер без создания цикла:
int m=2; // номер компоненты
for (int i=1; i<kolreb; i++) // пройти по всем ребрам
if (K[H[i][0]][1]!=K[H[i][1]][1])
// если 2 вершины не из одной компоненты
{
if (K [H [i] [0]] [1] >0 && K [H [i] [1]] [1] >0)
// если обе вершины принадлежат разной компоненте
{
for (int j=0; j<n; j++)
if (K [H [i] [1]] [1] ==K [j] [1])
K [j] [1] =K [H [i] [0]] [1];
K [H [i] [1]] [1] =K [H [i] [0]] [1];
T [H [i] [0]] [H [i] [1]] =H [i] [2];
T [H [i] [1]] [H [i] [0]] =H [i] [2];
}
if ( (K [H [i] [0]] [1] >0 && K [H [i] [1]] [1] ==0)
|| (K [H [i] [0]] [1] ==0 && K [H [i] [1]] [1] >0))
// если одна вершина имеет компоненту а др. нет
{
if (K[H[i][0]][1]!=0)
K [H[i][1]][1]=K[H[i][0]][1];
if (K[H[i][1]][1]!=0)
K [H[i][0]][1]=K[H[i][1]][1];
T [H[i][0]][H[i][1]]=H[i][2];
T [H[i][1]][H[i][0]]=H[i][2];
}
if (K [H [i] [0]] [1] ==0 && K [H [i] [1]] [1] ==0)
// если обе вершины не имели компоненты
{
K[H[i][0]][1]=m;
K[H[i][1]][1]=m;
T[H[i][0]][H[i][1]]=H[i][2];
T[H[i][1]][H[i][0]]=H[i][2];
m++;
}
} // конец проверки всех ребер
// ---выделение памяти для списка ребер
kolreb=0;
for (int i=1; i<n; i++)
for (int j=0; j<i; j++)
if (T[i][j]<max&&T[i][j]!=0)
kolreb++;
L=new tint [kolreb];
for (int i=0; i<kolreb; i++)
L [i] =new int [3];
// ------------------------------------------
// ---вывод ребер
cout<<endl<<" Vivod reber minimalnogo vesa: \n ";
a=0;
for (int i=1; i<n; i++)
for (int j=0; j<i; j++)
if (T[i][j]<max &&T[i][j]!=0){
L [a] [0] =i+1;
L [a] [1] =j+1;
L [a] [2] =T [i] [j];
a++;
}
for (int i=0; i<kolreb; i++) {
cout<<L [i] [0] <<"-->";
cout<<L [i] [1] <<" = ";
cout<<L [i] [2] <<"\n ";
}
int b=0;
for (int i=0; i<kolreb; i++)
b+=L [i] [2];
cout<<endl <<" Stoimost dereva = "<<b; // вывод стоимости
getch ();
// return 0;

Последний раз редактировалось FranZuZ; 12.12.2011 в 20:52.
FranZuZ вне форума Ответить с цитированием
Старый 12.12.2011, 20:52   #2
FranZuZ
 
Регистрация: 20.12.2009
Сообщений: 6
По умолчанию

Алгоритм Прима
int mrx[10][10];
int mrx1[10][10];
int i,j,count=0;

for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
mrx[i][j] = StrToIntDef(StringGrid1 -> Cells[i][j], 0);
}
}

int used[10];
int min = MAXINT;
for ( i=0;i<10;i++){ used[i]=0;
for( j=0;j<10;j++)
mrx1[i][j]=0;
};
used[0]=1;
do{
min = MAXINT;
for (i=0;i<10;i++){
if (used[i]!=0){
for(j=0;j<10;j++)
{if((mrx[i][j]<min)&(mrx[i][j]!=0)
&(used[j])==0)min=mrx[i][j];
}
}
};
for ( i=0;i<10;i++)
for (j=0;j<10;j++) if ((mrx[i][j]==min)&(used[j]==0))
{used[j]=1;mrx1[i][j]=mrx1[j][i]=min;count++;i=10;break;}
}while(count<9);

for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
StringGrid2 -> Cells[i][j] = IntToStr(mrx1[i][j]);
}
}
FranZuZ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Реализация структуры данных "дерево(указатели на родителей)" в Си Шарп Divus Помощь студентам 0 11.10.2010 04:23
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04