Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Шпоры по МПиПА / Графы / Путь минимального веса в нагруженном графе / C / Исходник / minLength
.cpp#include "iostream.h"
#include "stdio.h"
int *minimalLengthWay( int **weightMatrix, int dimension, int fromNode, int toNode, int *length, int *weight ){
int **minWeights; // Для хранения фронта волны
int i, j, k;
int *way; // Для хранения найденного пути и уже однажды пройденных вершин
bool find;
int tempLength;
int currNode;
minWeights = new int*[dimension];
for ( i = 0; i < dimension; i++ ) {
minWeights[i] = new int[dimension];
}
way = new int[dimension];
for ( i = 0; i < dimension; i ++ )
for ( j = 0; j < dimension; j ++ )
minWeights[i][j] = -1;
for ( i = 0; i < dimension; i ++ )
way[i] = -1;
for ( i = 0; i < dimension; i ++ )
minWeights[fromNode][i] = 0;
find = false;
for ( k = 0; k < dimension - 1; k ++ ) {
for ( i = 0; i < dimension; i ++ ) {
tempLength = minWeights[i][k];
for ( j = 0; j < dimension; j++ ) {
if ( minWeights[j][k] != -1 && weightMatrix[j][i] != -1 ) {
if ( ( tempLength != -1 && tempLength > minWeights[j][k] + weightMatrix[j][i] ) || tempLength == -1 ) {
tempLength = minWeights[j][k] + weightMatrix[j][i];
}
}
}
minWeights[i][k+1] = tempLength;
}
}
find = minWeights[toNode][dimension-1] != -1; // проверяем найден ли какй-либо путь
if ( find ) *weight = minWeights[toNode][dimension-1];
if ( find ) { // если путь найден - вычисляем его но в обратной последовательности
j = 0;
way[0] = toNode;
currNode = toNode;
for ( k = dimension - 2; k >= 0; k-- ) {
if ( minWeights[currNode][k] != minWeights[currNode][k + 1] ) {
for ( i = 0; i < dimension; i ++ ) {
if ( minWeights[i][k] + weightMatrix[i][currNode] == minWeights[currNode][k + 1] ) {
j++;
way[j] = i;
currNode = i;
break;
}
}
}
}
*length = j;
}
return way;
}
void main() {
int i, j;
int from, to, size;
int **array, *way;
int length, weight;
cout << "Minimal length.\nEnter graph dimension: ";
cin >> size;
array = new int*[size];
for ( i = 0; i < size; i++ ) {
array[i] = new int[size];
}
way = new int[size];
for ( i = 0; i < size; i ++ ){
cout << "Enter " << i + 1 << " row: ";
for ( j = 0; j < size; j ++ ){
cin >> array[i][j];
}
}
cout << "Enter From Node: ";
cin >> from;
cout << "Enter To Node: ";
cin >> to;
way = minimalLengthWay( array, size, from - 1, to - 1, &length, &weight );
cout << "\nExist way from " << from << " to " << to << " ?\nAnswer: from " << from << " to " << to << " ";
if ( way[0] == -1 )
cout << "not exist.";
else {
for ( i = length; i >= 0; i-- ){
if ( i != length ) cout << " -> ";
cout << way[i] + 1;
}
cout << "\nWeight: " << weight;
}
cout << "\nPress \"Enter\" to continue..." << endl;
getchar();
}