IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Алгоритм Прима, нахождение МОД
Andrewshkovskii
сообщение 23.11.2009 13:06
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Давно не виделись..всем привет! вот код неправильно работающего алгоритма Прима ( http://www.software.unn.ac.ru/cluster/cgi-...work=10&topic=1 ). Помогите найти ошибку, он не правильно считает минимальное остовное дерево (мод http://ru.wikipedia.org/wiki/Остовное_дерево ).
Код строго на с++. МОД необходимо представлять ввиде матрицы.
Уже не знаю что делать, глаза ошибки не могут найти..
int dm[matrixSize][matrixSize];//матрица смежности графа
int sm[matrixSize][matrixSize];//матрица МОД
int used[matrixSize];//использованные вершины
int count=0;
int min ;

for (int i=0; i< matrixSize; ++i)
{
used[i]=0;
for(int j=0;j< matrixSize;++j)
sm[i][j]=0;
}

used[0]=1;
do {
min=std::numeric_limits<int>::max();
for(int i=0;i<matrixSize;++i)
{
if (used[i]!=0)
{
for(int j=0;j<matrixSize;++j)
if ( (dm[j][i] < min) && (dm[j][i]!=0) && (used[j])==0)
min=dm[j][i];
}
}
for(int i=0;i < matrixSize;++i)
for(int j=0;j<matrixSize;++j)
if( (dm[j][i]== min) && (used[j]==0))
{
used[j] =1;
sm[j][i]= sm[i][j] = min;
count++;
i=matrixSize;
break;
}
}while(count < matrixSize-1);

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 23.11.2009 14:37
Сообщение #2


Гость






Цитата
вот код неправильно работающего алгоритма Прима
Кто сказал, что это неправильно работает? Проверяем:
    const int matrixSize = 6;
int dm[matrixSize][matrixSize] =
{
{ 0, 6, 1, 5, 0, 0 },
{ 6, 0, 5, 0, 3, 0 },
{ 1, 5, 0, 5, 6, 4 },
{ 5, 0, 5, 0, 0, 2 },
{ 0, 3, 6, 0, 0, 6 },
{ 0, 0, 4, 2, 6, 0 }
}; // матрица смежности графа из Ахо/Хопкрофта/Ульмана, стр. 211
// ...
// выводим полученную матрицу:
for(int i = 0; i < matrixSize; i++)
{
for(int j = 0; j < matrixSize; j++)
{
std::cout << sm[i][j] << " ";
}
std::cout << std::endl;
}
Вот чего выдает твой код:
0 0 1 0 0 0
0 0 5 0 3 0
1 5 0 0 0 4
0 0 0 0 0 2
0 3 0 0 0 0
0 0 4 2 0 0

Абсолютно совпадает с решением вышеперечисленных авторов. Это именно остовное дерево минимальной стоимости. Что не так?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 20:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"