Вы находитесь на странице: 1из 6

Министерство Образования и Исследований

Республики Молдова
Технический Университет Молдовы
Кафедра прикладной информатики

Отчет
по лабораторной работе Nr.5.
по Дискретной Математике
Тема: Алгоритм Беллмана-Каллаба. Поиск минимального
и максимального пути в ориентированном взвешенном
графе.

Вариант 13

Выполнил ст.гр. MN-222 Цуркану Д.


Проверил ассист.универ. Ориндаш В.

Кишинев – 2023
Лабораторная работа № 5
Тема: Алгоритм Беллмана-Колаба. Поиск минимального и максимального пути
в ориентированном взвешенном графе.
Цель работы: Изучение алгоритмов поиска минимального пути в графе.
Разработка программы, реализующей алгоритм Беллмана-Колаба для поиска
минимального и максимального пути во взвешенном графе.

Задание
1. Используя алгоритм Беллмана-Каллаба создать программу, позволяющую
найти минимальный либо максимальный путь в ориентированном взвешенном
графе.
2. У пользователя необходимо спросить начальную и конечную вершину, для
поиска пути.
3. На вход программе необходимо передать матрицу весов графа.
Код программы:
import java.util.Scanner;

public class MD_Lab_5{


static int vertices;
static int[][] graph;
static int[][] BellmanKallaba;
static int[][] V;
static int k;
// Функция заполнения матрицы Беллмана-Каллаба
static void BellmanKallabaMinMax(int n){
for(int i=0; i<vertices; ++i){
for(int j=0; j<vertices; ++j){
if(graph[i][j] != 0){
BellmanKallaba[i][j] = graph[i][j];
}
else if(i != j){
BellmanKallaba[i][j] = n;
}
else BellmanKallaba[i][j] = 0;
}
}
}
// Проверка векторов на схожесть
static boolean proverka(){
for(int i=0; i<vertices; ++i){
if(V[k][i] != V[k+1][i])
return false;
}
return true;
}
// Вывод пути
static void path(){
System.out.print(1);
for(int i=0; i<vertices; ){
for(int j=0; j<vertices; ++j){
if((BellmanKallaba[i][j] != 0) && (BellmanKallaba[i][j]
== (V[k][i] - V[k][j]))){
System.out.print(" -> " +(j+1));
i = j;
}
}
if(i == vertices - 1)
return;
}
}
// Создание и заполнение матрицы векторов
static void vectorMinMax(int n){
for(int i=0; i<vertices; ++i){
V[0][i] = BellmanKallaba[i][vertices-1];
}
for(k=0; k<vertices-1; ++k){
for(int i=0; i<vertices; ++i){
int minMax = n;
for(int j=0; j<vertices; ++j){
switch(n){
case 100:{
int weight = BellmanKallaba[i][j] + V[k][j];
if (weight < minMax)
minMax = weight;
break;
}
case -100:{
int weight = BellmanKallaba[i][j] + V[k][j];
if (weight > minMax)
minMax = weight;
break;
}
}
}
V[k+1][i] = minMax;
}
if(proverka()){
path();
return;
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Введите кол-во вершин в графе: ");
vertices = sc.nextInt();

graph = new int[vertices][vertices];


for(int i=0; i<vertices; ++i){
for(int j=0; j<vertices; ++j) {
System.out.println("Введите вес для дуги " + "(" + (i+1)
+ "-" + (j+1) + ") ");
graph[i][j] = sc.nextInt();
}
}
System.out.println();
// Минимальный путь
BellmanKallaba = new int[vertices][vertices];
BellmanKallabaMinMax(100);
V = new int[vertices][vertices];
vectorMinMax(100);
System.out.println();
System.out.println("Минимальный путь: " + V[k][0]);
// Максимальный путь
System.out.println();
BellmanKallabaMinMax(-100);
vectorMinMax(-100);
System.out.println();
System.out.println("Максимальный путь: " + V[k][0]);
}
}
Вывод программы:

Вывод:
На данной лабораторной работе я изучил и научился использовать алгоритм
Беллмана-Каллаба для нахождения минимального и максимального пути в
ориентированном взвешенном графе.

Вам также может понравиться