Скачиваний:
31
Добавлен:
02.05.2014
Размер:
3.11 Кб
Скачать
#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();
}