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

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

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

Отчет
по лабораторной работе Nr.5.

по Дискретной математике
Тема: Поиск максимального потока .Алгоритм Форда - Фалкерсона
Вариант 10

Выполнил ст.гр. MN-222 Шологан Артемиос


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

Кишинев – 2023
#include <stdio.h>
#include <limits.h>
#include <string.h>
#define MAX_VERTICES 4 // Максимальное количество
вершин
#define INF 1000000 // Большое значение, используемое
как "бесконечность"

int graph[MAX_VERTICES][MAX_VERTICES] = {
{0, 2, 3, 0},
{0, 0, 6, 5},
{0, 0, 0, 8},
{0, 0, 0, 0}
}; // граф в виде матрицы смежности
int parent[MAX_VERTICES]; // массив для хранения
родительских вершин

// Функция для нахождения максимального потока в графе


между истоком и стоком с помощью алгоритма Форда-Фалкерсона
int ford_fulkerson(int s, int t) {
int max_flow = 0;

while (1) {
memset(parent, -1, sizeof(parent)); // инициализация
массива parent

// Запускаем поиск в ширину с помощью алгоритма


BFS для нахождения увеличивающего пути
int queue[MAX_VERTICES];
int front = 0, rear = 0;
queue[rear++] = s;
parent[s] = -2;

while (front < rear && parent[t] == -1) {


int u = queue[front++];
for (int v = 0; v < MAX_VERTICES; v++) {
if (parent[v] == -1 && graph[u][v] > 0) {
parent[v] = u;
queue[rear++] = v;
}
}
}

// Если увеличивающий путь не найден, то выходим из


цикла
if (parent[t] == -1) {
break;
}

// Находим минимальную пропускную способность


ребер на увеличивающем пути
int path_flow = INT_MAX;
for (int v = t; v != s; v = parent[v]) {
int u = parent[v];
path_flow = path_flow < graph[u][v] ? path_flow :
graph[u][v];
}

// Обновляем остаточную сеть графа и увеличиваем


максимальный поток
for (int v = t; v != s; v = parent[v]) {
int u = parent[v];
graph[u][v] -= path_flow;
graph[v][u] += path_flow;
}
max_flow += path_flow;
}

return max_flow;
}int main() {
// Задаем исток и сток
int s = 1, t = 4;

// Вызываем функцию нахождения максимального потока


int max_flow = ford_fulkerson(s - 1, t - 1);

// Выводим результаты
printf("Максимальный поток в сети равен: %d\n", max_flow);

return 0;
}

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