Лабораторная №2. Графы
Скачать 33.93 Kb.
|
Тема работыГрафы Цель работыПолучить практические навыки представления графов в памяти ЭВМ, реализовать на языке программирования C/C++ алгоритмы работы с графами. ЗаданиеИспользуя алгоритм Дейкстры, найти кратчайший путь между двумя заданными вершинами во взвешенном неориентированном графе. Начальную и конечную вершины пути ввести с клавиатуры. Граф задать в текстовом файле матрицей весов. Алгоритм решенияВвод n Выделение памяти для матрицы весов размером NxN Инициализация массива меток значением false Цикл для i = 0 .. n – 1 Цикл для j = 0 .. n – 1 Ввод a[i][j] Ввод начальной вершины и конечной вершин - st и last Выделение памяти для массива расстояний Положим d[st] = 0 Цикл для j = 0 .. n – 1 Инициализация v значением -1 Цикл для j = 0 .. n – 1 Если !visited[j] и либо v == -1, либо d[j] < d[v] Положим v = j Положим visited[v] = true Цикл для j = 0 .. n – 1 Если a[v][j] > 0 и d[v] + a[v][j] < d[j] Положим d[j] = d[v] + a[v][j] Вывод d[last] Результаты работыРис. 1 Содержимое входного файла Рис. 2 Кратчайший путь из вершины 1 в 4 ВыводыВ результате выполнения этой лабораторной работы были получены навыки по реализации алгоритма Дейкстры для вычисления кратчайшего пути из одной вершины до другой. Приложение А. Листинг программы#include #include #include #include using namespace std; const int INF = 1e5; int n , m , st , last; vector< vector vector int main() { ifstream fin("graph.txt"); fin >> n; // Ввод количества вершин и количества ребер a.assign(n , vector visited.assign(n , false); // Метим массив значениями false for (int i = 0 ; i < n ; i++) for (int j = 0 ; j < n ; j++) fin >> a[i][j]; // Ввод матрицы весов cout << "Input first vertex: "; cin >> st; // Ввод стартовой вершины cout << "Input last vertex: "; cin >> last; // Ввод конечной вершины st--; last--; vector d[st] = 0; // От начальной вершины до нее самой расстояние = 0 for (int i = 0 ; i < n ; i++) { // Выполним n итераций int v = -1; // v - вспомогательная вершина, через которую будем обновлять расстояния for (int j = 0 ; j < n ; j++) // Цикл по всем вершинам if (!visited[j] && (v == -1 || d[j] < d[v])) v = j; // Если эта вершина не посещена, и расстояние до этой вершины минимально, сохраним эту вершину if (d[v] == INF) break; // Если через эту вершину уже обновиться не можем - выходим visited[v] = true; // Метим, что вершина посещена for (int j = 0 ; j < n ; j++) // Цикл по всем вершинам if (a[v][j] > 0 && d[v] + a[v][j] < d[j]) // Если можем обновить d[j] = d[v] + a[v][j]; // Обновляем массив расстояний } cout << "Minimal distance from first to last: "; if (d[last] == INF) d[last] = -1; cout << d[last]; return 0; } |