|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.12.2011, 20:49 | #1 |
Регистрация: 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. |
12.12.2011, 20:52 | #2 |
Регистрация: 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]); } } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. | воваава | Помощь студентам | 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 |