Скачайте в формате документа WORD

Поиск максимальных потоков в сетях

Министерство образования и науки Украины

Луганский национальный педагогический ниверситет имени Тараса Шевченко

Кафедра алгебры и дискретной математики

Киршта Александр Михайлович

Поиск максимальных потоков в сетях

Магистерская работ по специальности 8.080101

Математика

Научный руководитель Ц

к.ф.-м.н., доцент

Михайлова И.А.

Луганск - 2006 г.


Содержание/p>

Введени.3

Раздел I. Основные понятия и определения теории графов..6

1.1.         Понятие графа.6

1.2.         Графическое представление графов.7

1.3.         Виды графов7

1.4.         Элементы графов8

1.5.         Представление графов с помощью матриц..9

1.5.1.  Матрицы инцидентности и списки рёбер...9

1.5.2.  Матрицы смежности.12

Раздел II. Потоки в сетях..14

2.1.         Понятие сети14

2.2.         Задача о максимальном поток..16

2.3.         Алгоритм размещения пометок для задачи о максимальном поток16

2.4.           Алгоритм Форда-Фалкерсона18

2.5.         Граф со многими источниками и стоками22

2.6.         Задача о многополюсном максимальном поток24

Раздел. Автоматизация поиска максимальных потоков в сетях29

3.1.         Описание интерфейса программы.29

3.2.         Инструкция пользователя30

3.3.         Реализация программы33

3.4.         Описание программного кода38

Выводы40

Литература.41

Приложени43


ВВЕДЕНИЕ

Начало теории графов все единодушно относят к 1736 г., когда Эйлер не только решил популярную в то время задачу о кенигсбергских мостах, но и нашёл критерий существования в графе специального маршрута (эйлерова цикла, как теперь его называют). Однако этот результат более ста лет оставался единственным результатом теории графов. Лишь в середине XIX века инженер-электрик Г.Кирхгофф разработал теорию деревьев для исследования электрических цепей. А математик А. Кэли в связи с описанием строения углеводородов решил перечислительные задачи для трёх типов деревьев. К этому же периоду относится появление знаменитой проблемы четырёх красок.

Родившись при решении головоломок и занимательных игр (задачи о шахматном коне, о ферзях, кругосветное путешествие, задачи о свадьбах и гаремах и т. п.), теория графов в настоящее время стала простым, доступным и мощным средством решения вопросов, относящихся к широкому кругу проблем. В виде графов можно, например, интерпретировать схемы дорог и электрические цепи, географические карты и молекулы химических соединений, связи между людьми и группами людей.

За последние десятилетия теория графов превратилась в один из наиболее бурно развивающихся разделов математики. Это вызвано запросами стремительно расширяющейся области приложений. В теоретико-графовых терминах формулируется большое число задач, связанных с дискретными объектами. Рассмотрим примеры некоторых практических задач.

1. Транспортные задачи, в которых вершинами графа являются пункты, ребрами - дороги (автомобильные, железные и др.) или другие транспортные (например, авиационные) маршруты. Другой пример - сети снабжения (энергоснабжения, газоснабжения, снабжения товарами и т.д.), в которых вершинами являются пункты производства и потребления, ребрами - возможные маршруты перемещения (линии электропередач, газопроводы, дороги и т.д.). Соответствующий класс задач оптимизации потоков грузов, размещения пунктов производства и потребления и т.д., иногда называется задачами обеспечения или задачами о размещении. Их подклассом являются задачи о грузоперевозках.

2. Технологические задачи, в которых вершины отражают производственные элементы (заводы, цеха, станки и т.д.), дуги - потоки сырья, материалов и продукции между ними, заключаются в определении оптимальной загрузки производственных элементов и обеспечивающих эту загрузку потоков.

3. Обменные схемы, являющиеся моделями таких явлений как бартер, взаимозачеты и т.д. Вершины графа при этом описывают частников обменной схемы (цепочки), дуги - потоки материальных и финансовых ресурсов между ними. Задача заключается в определении цепочки обменов, оптимальной с точки зрения, например, организатора обмена и согласованной с интересами частников цепочки и существующими ограничениями.

4. правление проектами. С точки зрения теории графов проект - совокупность операций и зависимостей между ними. Хрестоматийным примером является проект строительства некоторого объекта. Совокупность моделей и методов, использующих язык и результаты теории графов и ориентированных на решение задач правления проектами, получила название календарно-сетевого планирования и правления (КСПУ). В рамках КСПУ решаются задачи определения последовательности выполнения операций и распределения ресурсов между ними, оптимальных с точки зрения тех или иных критериев (времени выполнения проекта, затрат, риска и др.).

5. Модели коллективов и групп, используемые в социологии, основываются на представлении людей или их групп в виде вершин, отношений между ними (например, отношений знакомства, доверия, симпатии и т.д.) - в виде ребер или дуг. В рамках подобного описания решаются задачи исследования структуры социальных групп, их сравнения, определения агрегированных показателей, отражающих степень напряженности, согласованности взаимодействия, и др.

6. Модели организационных структур, в которых вершинами являются элементы организационной системы, ребрами или дугами - связи (информационные, правляющие, технологические и др.) между ними.

Изучение этих и других подобных им практических задач приводит к теории потоков в сетях. В данной работе рассматривается только одна (но наиболее существенная) задача этой теории, именно задача нахождения максимального потока.


1. ОСНОВНЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ ТЕОРИИ

Пусть V - непустое множество, V (2) Ц множество всех его двухэлементных подмножеств. Пара (V, E), где Е - произвольное подмножество множества V (2), называется графом (неориентированным графом).

Элементы множества V называются вершинами графа, элементы множества Е - рёбрами. Множество вершин и рёбер графа G обозначаются символами VG и EG соответственно. Число |VG| вершин графа G называются его порядком и обозначаются через |G|. Если |G| = n, |EG| = m, то G называют (n,m)-графом.

Две вершины u и v графа смежны, если множество {u, v} является ребром, и не смежны в противном случае. Если e = {u, v} - ребро, то вершины u и v называют его концами. Такое ребро обозначают uv.

Два ребра называются смежными, если они имеют общий конец.

Вершина v и ребро e называются инцидентными, если v является концом ребра e (т.е. e = uv), и не инцидентными в противном случае.

Множество всех вершин графа G, смежных с некоторой вершиной v, называется окружением вершины v и обозначается через N(v).

Упорядоченная пара вершин называется ориентированным ребром.

Ориентированный граф (или орграф) - это пара (V, A), где V - множество вершин, А - множество ориентированных рёбер, которые называются дугами, АСкачайте в формате документа WORD

align="left">1.2. Графическое представление графов

Графы добно изображать в виде рисунков, состоящих из точек и линий, соединяющих некоторые из этих точек. При этом точки соответствуют вершинам графа, соединяющие пары точек линии (прямолинейные либо криволинейные) - рёбрам (табл.1).

Таблица 1

Элементы графов

Геометрические элементы

1. v Î VЦ вершина

1. Х - точка в пространстве.

2. {u,v} Ц ребро неориентированного графа

2. uХ−Хv - отрезок./p>

3. (v1,v2) - дуги в ориентированном графе

3. v1Х→v2 - направленный отрезок./p>

4. {v,v} Ц петля

4. Скачайте в формате документа WORD

align="left">1.3. Виды графов

Множество рёбер Е аможет быть пустым (рис. 1.1). Такой граф называется нуль-графом и обозначается Ø.

align="left">1.4. Элементы графов

Путь - это последовательность рёбер e1, e2, Е, em, такая, что рёбра ei, ei+1 имеют общую вершину. Число рёбер называется длинной пути. Если ни одна из вершин не появляется больше одного раза, то путь называется простым. Понятно, что в простом пути ни одно ребро не используется дважды.

Путь называется циклом, если его начальная вершина совпадает с конечной; простым циклом, если это не выполняется для других вершин.

Чередующаяся последовательность v1, e1, v2, e2, Е, el,vl+1 вершин и рёбер графа, такая, что ei = vivi+1 (i = 1, l), называется маршрутом. Если v1 =а vl+1, то маршрут замкнутый, иначе открытый.

Маршрут называется цепью, если все его рёбра различны, и простой цепью, если все вершины, кроме, возможно, крайних, различны. В цепи Скачайте в формате документа WORD

align="left">1.5. Представление графов с помощью матриц

1.5.1. Матрицы инцидентности и списки рёбер

Задать граф, значит, задать множество его вершин и рёбер, также отношение инцидентности. Когда граф G - конечный, для описания его вершин и рёбер достаточно их занумеровать. Пускай v1, v2,Е, vn - вершины графа G; e1, e2,Е, em - его рёбра. Отношение инцидентности можно обозначить матрицей img src="images/picture-022-113.gif.zip" title="Скачать документ бесплатно">Скачайте в формате документа WORD

align="left">2. ПОТОКИ В СЕТЯХ

Сетью будем называть ориентированный связный граф без петель и параллельных рёбер. Потоки в неориентированных графах можно изобразить в виде потоков в соответствующих ориентированных. Поток в петле не влияет на распределение потока между вершинами. Рассмотрим сеть G = (V, E), |V | = n, |E| = m. Пускай каждой дуге еj Скачайте в формате документа WORD

align="left">2.2. Задача о максимальном потоке /h1>

На практике часто возникает проблема определения максимальной проводимости некоторой реальной сети: сети транспортной, сети ЭВМ, других. Иногда нужно определить самый дешёвый поток и т.д. Все эти и многие другие задачи решаются с помощью алгоритмов, которые работают на сетях. Так, алгоритм о максимальном потоке ищет максимально возможную пропускную способность сети, алгоритм минимальной стоимости - самый дешёвый поток. В данном разделе будем рассматривать задачу о максимальном потоке.

Задача заключается в нахождении такого множества потоков по дугам, чтобы величина Q(vs) была максимальной.

Разрез S отделяет vs от vt, если вершины vs, vt принадлежат разным сторонам разреза: vs Скачайте в формате документа WORD

align="left">2.3. Алгоритм размещения пометок для задачи о максимальном потоке

лгоритм размещения пометок основан на следующей теореме.

Теорема 1.Теорема про максимальный поток и минимальный разрез. Для произвольной сети максимальная величина потока из vs в vt равняется минимальной пропускной способности разреза, который отделяет vs от vt.

Доказательство

Покажем, что величина w произвольного потока φ не превышает пропускной способности разреза (Vs,Vt), который отделяет vs от vt. Поскольку функция φ поток, то она довлетворяет равнению (1) сохранении потока:

Скачайте в формате документа WORD

align="left">2.4. Алгоритм Форда-Фалкерсона

Доказательство теоремы 1 даёт алгоритм для построения минимального разреза (Vs, Vt), который отделяет vs от vt, и максимальный поток φ от vs до vt. Этот алгоритм был предложен Л. Фордом и Д. Фалкерсоном. Алгоритм начинает работу с известного допустимого потока φ (например, с нулевого). Потом расчеты развиваются в виде последовательности расстановки пометок (операция А), каждая из которых приводит к потоку с большей величиной (операция Б), или же завершается выводом, что рассмотренный поток максимален.

Будем предполагать, что пропускные способности cj дуг сети целые числа.

Операция А (расстановка пометок). Каждая вершина может находиться в одном из трёх состояний: вершине приписана пометка и вершина просмотрена (то есть она имеет пометку и все смежные с ней вершины обработаны), вершина помечена, но не просмотрена, вершина не помечена. Пометка вершины vi имеет один из двух видов: (+vj, l) или (-vj, l). Часть +vj пометки первого типа показывает, что поток допускает величение вдоль дуги (vj, vi) на величину l. Часть -vj пометки второго типа показывает, что поток допускает меньшения вдоль дуги (vi, vj) на величину l. Сначала все вершины не имеют пометок.

Шаг 1. Источнику vs присваивается пометка (+, img src="images/picture-130-23.gif.zip" title="Скачать документ бесплатно">Скачайте в формате документа WORD

align="left">2.5. Графы со многими источниками и стоками

лгоритм Форда-Фалкерсона примененный и для определения величины максимального потока между множеством вершин - источников и множествома вершин - стоков. Разобьем множество вершин на множество источников V+ = {v Скачайте в формате документа WORD

align="left">2.6. Задача о многополюсном максимальном потоке

Рассмотрим задачу нахождения максимального потока для всех пар злов в неориентированной сети. Эту задачу можно рассматривать как обобщение задачи с одним источником и одним стоком, которую можно решить, применяя алгоритм Форда-Фалкерсона для каждой пары вершин. Однако более эффективным является алгоритм, предложенный Р. Гомори и Т. Ху.

лгоритм Гомори-Ху

1. Выберем некоторые две вершины графа. Обозначим одну из них через vs, а другую через vt.

2. Применим алгоритм Форда-Фалкерсона и найдём максимальный поток из источника vs в сток vt. При этом множество помеченных вершин и множество непомеченных вершин образуют две стороны минимального разреза Vs и Vt.

3. Выберем две вершины графа vi и vj Скачайте в формате документа WORD

align="left">3.1. Описание интерфейса программы


Главное окно программы содержит:

Ц       таблицу для введения матрицы пропускных способностей;

Ц       окно для просмотра матрицы максимального потока;

Ц       поле для введения количества вершин;

Ц       поля для введения начала и конца транспортной сети;

Ц       поле для просмотра величины максимального потока;

Ц       поле для введения номера вершины, пометку которой ми бы хотели видеть;

Ц       поля для просмотра этих пометок;

Ц       кнопки Количество вершин, Считать поток, Итерации, Начать сначала, Показать пометки (рис. 3.1).

align="left">ЛИТЕРАТУРА

                             1.      Алгоритмы и программы решения задач на графах и сетях. Отв. ред. М.И. Нечепуренко. - Новосибирск: Наука. Сиб. отделение, 1990. - 513 с.

                             2.      Андрйчук В.., Комарницький М.Я., щук Ю.Б. Вступ до дискретно

                             3.      Архангельский А.Я. Приемы программирования в Delphi. Версии 5 Ц 7. М.: ЗАО Издательство БИНОМ, 2003./p>

                             4.      Дискретна математика: Пдручник/ Ю.М. Бардачов, Н.А. Соколова, В.к. Ходаков; за ред. В.к. Ходакова. - К.: Вища шк., 2002. - 287 с.: л.

                             5.      Дискретная математика: логика, группы, графы/ О.Е. Акимов. - 2-е изд., доп. - М.: Лаборатория Базовых Знаний, 2003. - 376 с.: ил./p>

                             6.      Зыков А.А. Основы теории графов. - М.: Наука, 1987. - 381 с./p>

                             7.      Климова Л.М. Delphi 7. Основы программирования. Решение типовых задач. Самоучитель - М.: КУДИЦ-ОБРАЗ, 2004. - 480 с./p>

                             8.      Крстофдес Р. Теория графов. Переклад на росйську мову Мир 1978.

                             9.      Лекции по дискретной математике/ Ю.В. Капитонова, С.Л. Кривой, А.А. Летичевский и др. - Пб.: БХВ-Петербург, 2004. - 624 с.

                        10.      Лекции по теории графов/ Емеличев В.А., Мельниченков О.И., Сарванов В.И., Тышкевич Р.И. - М.: Наука, Гл. ред. физ.-мат. лит., 1990. - 384 с.

                        11.      Лекции по теории графов: учебн. пособие. Ц М.: Наука, 1990. - 384 с.

                        12.      Липский В. Комбинаторика для программистов: Пер. с польск. - М.: Мир, 1988. - 213 с.: ил./p>

                        13.      Магрупов Т.М. Графы, сети, алгоритмы и их приложения/ Под ред. Ф.Б. Абуталиева; АН УР, Ин-т кибернетики с ВЦ зНПО Кибернетика: - Ташкент: Фан, 1990. - 120 с./p>

                        14.      Математическое программирование (с элементами информационных технологий): учеб. пособие для студ. нематемат. спец. вузов/ В.Р. Кулян, Е.А. Юнькова, А.Б. Жильцов. - К.: МАУП, 2. - 124 с.: ил./p>

                        15.      Мiхайленко В.М. Дискретна математика. - К.: квропейський н-т, 2003. - 319.

                        16.      Новиков Ф.А. Дискретная математика для программистов. - Пб.: Питер, 2004. - 302 с.: ил./p>

                        17.      Седжвк Д. Програмирование на С++. Часть 5. Алгоритмы на графах. Ки

                        18.      Теория графов и её применение: сборник научных трудов/ Институт математики им. С.Л. Соболева. - Новосибирск, 1996. - 106 с.

                        19.      Яблонский С.В. Введение в дискретную митематику. - М.: Наука, 1986. - 384 с.


ПРИЛОЖЕНИЕ/h1>

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, DBGrids, AxCtrls, OleCtrls, VCF1, ComCtrls, StdCtrls;

type

TForm1 = class(TForm)

E11: TEdit; E21: TEdit; E31: TEdit; E41: TEdit; E51: TEdit; E61: TEdit;

E71: TEdit; E81: TEdit; E91: TEdit; E101: TEdit; E12: TEdit; E22: TEdit;

E32: TEdit; E42: TEdit; E52: TEdit; E62: TEdit; E72: TEdit; E82: TEdit;

E92: TEdit; E102: TEdit; E13: TEdit; E23: TEdit; E33: TEdit; E43: TEdit;

E53: TEdit; E63: TEdit; E73: TEdit; E83: TEdit; E93: TEdit; E103: TEdit;

E14: TEdit; E24: TEdit; E34: TEdit; E44: TEdit; E54: TEdit; E64: TEdit;

E74: TEdit; E84: TEdit; E94: TEdit; E104: TEdit; E15: TEdit; E25: TEdit;

E35: TEdit; E45: TEdit; E55: TEdit; E65: TEdit; E75: TEdit; E85: TEdit;

E95: TEdit; E105: TEdit; E16: TEdit; E26: TEdit; E36: TEdit; E46: TEdit;

E56: TEdit; E66: TEdit; E76: TEdit; E86: TEdit; E96: TEdit; E106: TEdit;

E17: TEdit; E27: TEdit; E37: TEdit; E47: TEdit; E57: TEdit; E67: TEdit;

E77: TEdit; E87: TEdit; E97: TEdit; E107: TEdit; E18: TEdit; E28: TEdit;

E38: TEdit; E48: TEdit; E58: TEdit; E68: TEdit; E78: TEdit; E88: TEdit;

E98: TEdit; E108: TEdit; E19: TEdit; E29: TEdit; E39: TEdit; E49: TEdit;

E59: TEdit; E69: TEdit; E79: TEdit; E89: TEdit; E99: TEdit; E109: TEdit;

E110: TEdit; E210: TEdit; E310: TEdit; E410: TEdit; E510: TEdit;

E610: TEdit; E710: TEdit; E810: TEdit; E910: TEdit; E1010: TEdit;

In11: TEdit; In21: TEdit; In31: TEdit; In41: TEdit; In51: TEdit;

In61: TEdit; In71: TEdit; In81: TEdit; In91: TEdit; In101: TEdit;

In12: TEdit; In22: TEdit; In32: TEdit; In42: TEdit; In52: TEdit;

In62: TEdit; In72: TEdit; In82: TEdit; In92: TEdit; In102: TEdit;

In13: TEdit; In23: TEdit; In33: TEdit; In43: TEdit; In53: TEdit;

In63: TEdit; In73: TEdit; In83: TEdit; In93: TEdit; In103: TEdit;

In14: TEdit; In24: TEdit; In34: TEdit; In44: TEdit; In54: TEdit;

In64: TEdit; In74: TEdit; In84: TEdit; In94: TEdit; In104: TEdit;

In15: TEdit; In25: TEdit; In35: TEdit; In45: TEdit; In55: TEdit;

In65: TEdit; In75: TEdit; In85: TEdit; In95: TEdit; In105: TEdit;

In16: TEdit; In26: TEdit; In36: TEdit; In46: TEdit; In56: TEdit;

In66: TEdit; In76: TEdit; In86: TEdit; In96: TEdit; In106: TEdit;

In17: TEdit; In27: TEdit; In37: TEdit; In47: TEdit; In57: TEdit;

In67: TEdit; In77: TEdit; In87: TEdit; In97: TEdit; In107: TEdit;

In18: TEdit; In28: TEdit; In38: TEdit; In48: TEdit; In58: TEdit;

In68: TEdit; In78: TEdit; In88: TEdit; In98: TEdit; In108: TEdit;

In19: TEdit; In29: TEdit; In39: TEdit; In49: TEdit; In59: TEdit;

In69: TEdit; In79: TEdit; In89: TEdit; In99: TEdit; In109: TEdit;

In110: TEdit; In210: TEdit; In310: TEdit; In410: TEdit; In510: TEdit;

In610: TEdit; In710: TEdit; In810: TEdit; In910: TEdit; In1010: TEdit;

ST1: TStaticText; ST2: TStaticText; ST3: TStaticText; ST4: TStaticText;

ST5: TStaticText; ST6: TStaticText; ST7: TStaticText; ST8: TStaticText;

ST9: TStaticText; ST10: TStaticText; OST1: TStaticText;

OST4: TStaticText; OST3: TStaticText; OST2: TStaticText;

OST5: TStaticText; OST6: TStaticText; OST7: TStaticText;

OST8: TStaticText; OST9: TStaticText; OST10: TStaticText;

VST1: TStaticText; VST2: TStaticText; VST3: TStaticText;

VST4: TStaticText; VST5: TStaticText; VST6: TStaticText;

VST7: TStaticText; VST8: TStaticText; VST9: TStaticText;

VST10: TStaticText; OVST1: TStaticText; OVST2: TStaticText;

OVST3: TStaticText; OVST4: TStaticText; OVST5: TStaticText;

OVST6: TStaticText; OVST7: TStaticText; OVST8: TStaticText;

OVST9: TStaticText; OVST10: TStaticText; : TEdit;

StaticText41: TStaticText; : TEdit; StaticText42: TStaticText;

Button1: TButton; StaticText43: TStaticText; StaticText44: TStaticText;

col: TEdit; label1: TLabel; Button2: TButton; Label2: TLabel;

max: TEdit; Button3: TButton; GB1: TGroupBox; Label3: TLabel;

Label4: TLabel; Label5: TLabel; Label6: TLabel; p1: TEdit;

p2: TEdit; p3: TEdit; p4: TEdit; Button4: TButton; Button5: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormCreate(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

function min(x,y: double): double;

const p1=10;

type

sign=(minus,plus);

ibool=0..1;

Rec=record

s:sign; {направление дуги}

n:1..p1; {предшествующая вершина в аугментальной цепи}

delta:double; {величина возможного величения потока}

end;

var

Form1: TForm1;

F: array of array of double;

P: array of Rec;

implementation

{$R *.dfm}

function min(x,y: double): double;

begin

if x < y then

Result := x

else

Result := y;

end;

procedure TForm1.Button1Click(Sender: TObject);

label M;

const p1=10;

type

sign=(minus,plus);

ibool=0..1;

Rec=record

s:sign; {направление дуги}

n:1..p1; {предшествующая вершина в аугментальной цепи}

delta:double; {величина возможного величения потока}

end;

var i,j: integer;

del,ch:double;

C,F: array of array of double;

P: array of Rec;

N,S: array of ibool;

a:ibool;

pp,s1,t1,x: byte;

input,output:array of array of TEdit;

begin

pp:=StrToInt(col.Text);

SetLength(input,pp);

SetLength(output,pp);

SetLength(C,pp);

SetLength(F,pp);

SetLength(P,pp);

SetLength(N,pp);

SetLength(S,pp);

for i:=0 to pp-1 do

begin

SetLength(input[i],pp);

SetLength(output[i],pp);

SetLength(C[i],pp);

SetLength(F[i],pp);

end;

for i:=1 to pp do

for j:=1 to pp do

begin

F[i-1,j-1] := 0; {вначале поток нулевой}

input[i-1,j-1]:=FindComponent(Format('In%d%d',[i,j])) as TEdit;

output[i-1,j-1]:=FindComponent(Format('E%d%d',[i,j])) as TEdit;

if input[i-1,j-1].Text<>'' then C[i-1,j-1]:=StrToFloat(input[i-1,j-1].Text)

else C[i-1,j-1]:=0;

end;

s1 := StrToInt(.Text[2]);

if (s1=1) and (length(.Text)=3) then

s1:=10;

t1 := StrToInt(.Text[2]);

if (t1=1) and (length(.Text)=3) then

t1:=10;

M: {итерация величения потока}

for i:=1 to pp do

begin

S[i-1] := 0;

N[i-1] := 0;

with P[i-1] do

begin

//s := null;

//n := nil;

delta := 0;

end;

end;

S[s1-1]:=1;

with P[s1-1] do

begin

s:=plus;

n:=s1;

end;

repeat

a:=0; {признак расширения S}

for i:=1 to pp do

begin

if (S[i-1]=1) and (N[i-1]=0) then

begin

for j:=1 to pp do

begin

if C[i-1,j-1]<>0 then

begin

if (S[j-1]=0) and (F[i-1,j-1] < C[i-1,j-1]) then

begin

S[j-1] := 1;

with P[j-1] do

begin

s := plus;

n := i;

if i=s1 then delta := C[i-1,j-1] - F[i-1,j-1]

else delta := min(P[i-1].delta,C[i-1,j-1] - F[i-1,j-1]);

end;

a := 1;

аend;

end;

if C[j-1,i-1]<>0 then

begin

if (S[j-1]=0) and (F[j-1,i-1]>0) then

begin

S[j-1] := 1;

with P[j-1] do

begin

s := minus;

n := i;

if i=s1 then delta := F[j-1,i-1]

else delta := min(P[i-1].delta,F[j-1,i-1]);

end;

a:=1;

end;

end;

end;

N[i-1] := 1;

end;

end;

if S[t1-1]<>0 then

begin

x:=t1;

del:=P[t1-1].delta;

while x<>s1 do

begin

if P[x-1].s=plus then

F[P[x-1].n-1,x-1]:=F[P[x-1].n-1,x-1]+del

else

F[x-1,P[x-1].n-1]:=F[x-1,P[x-1].n-1]-del;

x:=P[x-1].n

end;

goto M;

end;

until a=0;

ch:=0;

for i:=1 to pp do

begin

ch:=ch+F[s1-1,i-1];

for j:=1 to pp do

begin

if C[i-1,j-1]<>0 then

output[i-1,j-1].Text := FloatToStr(F[i-1,j-1])

else

output[i-1,j-1].Text := '';

end;

end;

max.Text := FloatToStr(ch);

end;

//----------------------------------------------------

procedure TForm1.Button2Click(Sender: TObject);

const p1=10;

var InG,InV,OutG,OutV :array[1..p1] of TStaticText;

i,pp,j: byte;

input,output:array[1..p1,1..p1] of TEdit;

begin

.Text:='';

.Text:='';

max.Text:='';

pp:=StrToInt(Col.Text);

SetLength(F,pp);

for i:=1 to pp do

begin

SetLength(F[i-1],pp);

for j:=1 to pp do

F[i-1,j-1] := 0;

end;

for i:=1 to p1 do

begin

InG[i] := FindComponent(Format('ST%d',[i])) as TStaticText;

InV[i] := FindComponent(Format('VST%d',[i])) as TStaticText;

OutG[i] := FindComponent(Format('OST%d',[i])) as TStaticText;

OutV[i] := FindComponent(Format('OVST%d',[i])) as TStaticText;

if i<=pp then

begin

InG[i].Visible:=true;

InV[i].Visible:=true;

OutG[i].Visible:=true;

OutV[i].Visible:=true;

end

else

begin

InG[i].Visible:=false;

InV[i].Visible:=false;

OutG[i].Visible:=false;

OutV[i].Visible:=false;

end;

for j:=1 to p1 do

begin

input[i,j] := FindComponent(Format('In%d%d',[i,j])) as TEdit;

output[i,j] := FindComponent(Format('E%d%d',[i,j])) as TEdit;

if (i<=pp) and (j<=pp) then

begin

input[i,j].Visible:=true;

output[i,j].Visible:=true;

input[i,j].Text:='';

output[i,j].Text:='';

end

else

begin

input[i,j].Visible:=false;

output[i,j].Visible:=false;

end;

end;

end;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

var

i, cavb : 0..255;

begin

if AlphaBlend=False then

begin

AlphaBlendValue:=255;

AlphaBlend:=True;

end;

cavb:=AlphaBlendValue;

for i := cavb downto 0 do

begin

AlphaBlendValue := i;

Application.ProcessMessages;

end

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Form1.Height:=600;

Form1.Width:=800;

end;

procedure TForm1.Button3Click(Sender: TObject);

var i,j: integer;

del:double;

C: array of array of double;

N,S: array of ibool;

a:ibool;

pp,s1,t1,x: byte;

input,output:array of array of TEdit;

begin

p1.Text :='';

p2.Text :='';

p3.Text :='';

p4.Text :='';

pp:=StrToInt(col.Text);

SetLength(input,pp);

SetLength(output,pp);

SetLength(C,pp);

SetLength(P,pp);

SetLength(N,pp);

SetLength(S,pp);

for i:=0 to pp-1 do

begin

SetLength(input[i],pp);

SetLength(output[i],pp);

SetLength(C[i],pp);

end;

for i:=1 to pp do

for j:=1 to pp do

begin

input[i-1,j-1]:=FindComponent(Format('In%d%d',[i,j])) as TEdit;

output[i-1,j-1]:=FindComponent(Format('E%d%d',[i,j])) as TEdit;

if input[i-1,j-1].Text<>'' then C[i-1,j-1]:=StrToFloat(input[i-1,j-1].Text)

else C[i-1,j-1]:=0;

end;

s1 := StrToInt(.Text[2]);

if (s1=1) and (length(.Text)=3) then

s1:=10;

t1 := StrToInt(.Text[2]);

if (t1=1) and (length(.Text)=3) then

t1:=10;

for i:=1 to pp do

begin

S[i-1] := 0;

N[i-1] := 0;

with P[i-1] do

begin

//s := null;

//n := nil;

delta := 0;

end;

end;

S[s1-1]:=1;

with P[s1-1] do

begin

s:=plus;

n:=s1;

end;

repeat

a:=0; {признак расширения S}

for i:=1 to pp do

begin

if (S[i-1]=1) and (N[i-1]=0) then

begin

for j:=1 to pp do

begin

if C[i-1,j-1]<>0 then

begin

if (S[j-1]=0) and (F[i-1,j-1] < C[i-1,j-1]) then

begin

S[j-1] := 1;

with P[j-1] do

begin

s := plus;

n := i;

if i=s1 then delta := C[i-1,j-1] - F[i-1,j-1]

else delta := min(P[i-1].delta,C[i-1,j-1] - F[i-1,j-1]);

end;

a := 1;

end;

end;

if C[j-1,i-1]<>0 then

begin

if (S[j-1]=0) and (F[j-1,i-1]>0) then

begin

S[j-1] := 1;

with P[j-1] do

begin

s := minus;

n := i;

if i=s1 then delta := F[j-1,i-1]

else delta := min(P[i-1].delta,F[j-1,i-1]);

end;

a:=1;

end;

end;

end;

N[i-1] := 1;

end;

end;

if S[t1-1]<>0 then

begin

x:=t1;

del:=P[t1-1].delta;

while x<>s1 do

begin

if P[x-1].s=plus then

F[P[x-1].n-1,x-1]:=F[P[x-1].n-1,x-1]+del

else

F[x-1,P[x-1].n-1]:=F[x-1,P[x-1].n-1]-del;

x:=P[x-1].n

end;

Break;

end;

until a=0;

for i:=1 to pp do

begin

for j:=1 to pp do

begin

if C[i-1,j-1]<>0 then

output[i-1,j-1].Text := FloatToStr(F[i-1,j-1])

else

output[i-1,j-1].Text := '';

end;

end;

end;

procedure TForm1.Button4Click(Sender: TObject);

var s1,ver: byte; // Вершина

begin

p4.Font.Name := 'MS Sans Serif';

ver := StrToInt(p1.Text[2]);

if (ver=1) and (length(p1.Text)=3) then

ver:=10;

s1 := StrToInt(.Text[2]);

if (s1=1) and (length(.Text)=3) then

s1:=10;

if P[ver-1].s=plus then p3.Text := '+'

else p3.Text := '-';

p2.Text := 'x' + IntToStr(P[ver-1].n);

if ver<>s1 then

p4.Text := FloatToStr(P[ver-1].delta)

else

begin

p4.Font.Name :='Symbol';

p4.Text := 'е';

end;

end;

procedure TForm1.Button5Click(Sender: TObject);

var pp,i,j : integer;

output:array of array of TEdit;

begin

pp:=StrToInt(Col.Text);

SetLength(F,pp);

SetLength(output,pp);

for i:=1 to pp do

begin

SetLength(output[i-1],pp);

SetLength(F[i-1],pp);

for j:=1 to pp do

begin

F[i-1,j-1] := 0;

output[i-1,j-1]:=FindComponent(Format('E%d%d',[i,j])) as TEdit;

output[i-1,j-1].Text := '';

end;

end;

end;

end.