Алгоритм Форда – Фалкерсона для нахождения максимального потока

Разработка алгоритма программы, которая находит максимальный поток в транспортной сети. Исходный граф, который в программе задается матрицей смежности, граничные условия при вводе данных, проверка корректности их введения через графический интерфейс.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.02.2019
Размер файла 2,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования Российской Федерации

Пензенский государственный университет

Кафедра "Вычислительная техника"

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе

по курсу "Логика и основы алгоритмизации в инженерных задачах"

на тему "Алгоритм Форда - Фалкерсона для нахождения максимального потока"

Выполнил: студент Ягудин М.Р.

Приняли: Малютина Г.И., Пащенко Д.В.

Пенза 2017

Оглавление

  • Введение
  • 1. Постановка задачи
  • 2. Теоретическая часть задания
  • 2.1 Общие теоретические сведения
  • 2.2 Описание алгоритма программы
  • 3. Ручной расчёт задачи
  • 4. Описание программы
  • 5. Тестирование
  • Заключение
  • Список литературы
  • Приложение А. Листинг программы

Введение

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

В качестве среды разработки мною была выбрана среда Microsoft Visual Studio 2017, язык программирования - С++.

В ходе выполнения данной курсовой работы были приобретены навыки работы с формами и их элементами в среде Microsoft Visual Studio 2017, навыки работы с проектами и многомодульными программами.

1. Постановка задачи

Требуется разработать программу, которая находит максимальный поток в транспортной сети.

Исходный граф в программе должен задаваться матрицей смежности, причём при вводе данных должны быть предусмотрены граничные условия, должна выполняться проверка корректности введенных данных. Устройства ввода данных - клавиатура и мышь. Программа должна быть разработана для работы в операционной системе Microsoft Windows. Для удобства использования программы должен быть разработан графический интерфейс оформленный при помощи Windows Form Application с возможностью ввода и вывода информации.

Задания выполняются в соответствии с вариантом №20.

2. Теоретическая часть задания

2.1 Общие теоретические сведения

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

Введем основные понятия данной теории.

Транспортной сетью называется орграф D = (V,X) с множеством вершин V = {v1,…,vn}, для которого выполняются условия:

1) существует одна и только одна вершина v1, называемая источником, такая, что Г-1 (v1) = (т.е. ни одна дуга не заходит в v1),

2) существует одна и только одна вершина vn, называемая стоком, такая, что Г(vn) = (т.е. из vn не исходит ни одной дуги),

3) каждой дуге xX поставлено в соответствие целое число c (x) 0, называемое пропускной способностью дуги.

Функция (x), определенная на множестве X дуг транспортной сети D и принимающая целочисленные значения, называется допустимым потоком (или просто потоком) в транспортной сети D, если

4) для любой дуги xX величина (x), называемая потоком по дуге x, удовлетворяет условию 0 (x) c(x),

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

Величиной потока в транспортной сети D называется величина, равная сумме потоков по всем дугам, заходящим в сток, или, что то же самое сумме потоков по всем дугам, исходящим из источника.

Дуга xX называется насыщенной, если поток по ней равен ее пропускной способности. Поток называется полным, если любой путь в сети из источника в сток содержит, по крайней мере, одну насыщенную дугу.

2.2 Описание алгоритма программы

Данные: транспортная сеть D, заданная матрицей пропускных способностей дуг.

Результат: полный поток в сети.

1) Полагаем для любой дуги xХ (x) = 0 (начинаем с нулевого потока).

2) Полагаем D* = D.

3) Удаляем из орграфа D* все дуги, являющиеся насыщенными при потоке в транспортной сети D. Полученный орграф снова обозначим через D*.

4) Ищем в D* простую цепь из v1 в vn . Если такой цепи нет, то - искомый максимальный поток в транспортной сети D. В противном случае переходим к шагу 5.

5) Увеличиваем поток (x) по каждой дуге x из на одинаковую величину a>0 такую, что, по крайней мере, одна дуга из окажется насыщенной, а потоки по всем остальным дугам из не превышают их пропускных способностей. При этом величина потока также увеличится на a, а сам поток в транспортной сети D остается допустимым. После этого перейдем к шагу 3.

На рисунке 1 показана схема работы программы.

Рисунок 1 - Схема программы

3. Ручной расчёт задачи

Дана транспортная сеть D(V,X) (рис. 5.3). Построить максимальный поток.

Рисунок 2- Транспортная сеть

Полагаем =D,, т.е. начинаем с нулевого потока (см. рис. 5.4).

Рисунок 3 - Орграф ,,, 1=v1v2v4v6.

Насыщенные дуги отсутствуют. Выделим в простой путь 1=v1v2v4v6 и увеличим потоки по дугам на а 1= 3 до насыщения дуги (v2,v4) (рис. 5.5)

Рисунок 4 - Поток ,.

В результате получим ,, содержащий одну насыщенную дугу. Пометим её знаком "~" и удалим из орграфа. Оставшийся граф снова обозначим через(рис. 5.6)

Рисунок 5 - Орграф ,2=v1v2v3v4v6.

Рисунок 6 - Поток ,.

Рисунок 7 - Орграф ,3=v1v3v5v6.

Рисунок 8 - Поток ,.

Рисунок 9 - Орграф ,4=v1v2v5v6.

Рисунок 10 - Поток ,.

Рисунок 11 - Орграф , 5.

В полученном графе не существует пути из v1 в v6, следовательно, потокявляется максимальным (см. рис. 5.11).

4. Описание программы

алгоритм граф матрица интерфейс

Программа разбита на несколько модулей. Логика.cpp - главный файл проекта. В нем осуществляется запуск главного окна Form1().

Файл Form1.h отвечает за внешний вид главного окна, а именно: заголовок, пункты меню. Также в этом файле осуществляются сам алгоритм поиска максимального потока.

На рисунке 12 изображено стартовое окно программы:

Рисунок 12 - стартовое окно программы

Далее мы указываем количество вершин и рёбер в графе, после этого мы можем задать вес рёбер вручную или же заполнить их случайным образом, из диапазона случайных значений, который мы указываем в программе. После заполнения матрицы нажимаем появившиеся кнопки "Вывести граф" и "Рассчитать максимальный поток" и получаем графическое изображение сети и значение максимального потока. На рисунке 13. Показан результат работы программы.

Рисунок 13 - результат работы программы

5. Тестирование

В программе предусмотрена защита от случайного ввода некорректных значений. В результате тестирования программы были получены следующие результаты.

Если пользователь неправильно вводит исходную матрицу смежности (вводит текстовые), то выдаётся окно с ошибкой "Ошибка ввода матрицы смежности".

Рисунок 14 - неправильный ввод исходной матрицы

Заключение

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

При выполнении данной работы использовались функции Windows.form, описанные в заголовочном файле Windows.h для визуализации результатов работы.

Во время выполнения курсового проекта был использован такой приём как выделение динамической памяти.

В ходе тестирования были выявлены основные преимущества и недостатки изучаемого алгоритма.

Список литературы

1. Брайан Керниган, Деннис Ритчи - Язык программирования Си, 2-е издание, 2016.

2. Стивен Прата - Язык программирования C++. Лекции и упражнения, 6-е издание, 2017.

3. Брюс Эккель - Философия C++. Введение в стандартный C++, 2-е издание, 2004.

Приложение А. Листинг программы

#pragma once

#include <memory.h>

#include <string.h>

#include <stdlib.h>

#include <ctime>

#include <math.h>

#define M_PI 3.14159265358979323846

const int MAX_VERTICES = 100;

int NUM_VERTICES;

int f[MAX_VERTICES][MAX_VERTICES];

int c[MAX_VERTICES][MAX_VERTICES];

int Flow[MAX_VERTICES];

int Link[MAX_VERTICES];

int Queue[MAX_VERTICES];

int QP, QC;

int source, target;

int FindPath(int source, int target)

{

QP = 0; QC = 1; Queue[0] = source;

Link[target] = -1;

int i;

int CurVertex;

memset(Flow, 0, sizeof(int)*NUM_VERTICES);

Flow[source] = 10000;

while (Link[target] == -1 && QP < QC)

{

CurVertex = Queue[QP];

for (i=0; i<NUM_VERTICES; i++)

if ((c[CurVertex][i] - f[CurVertex][i])>0 && Flow[i] == 0)

{

Queue[QC] = i; QC++;

Link[i] = CurVertex;

if (c[CurVertex][i]-f[CurVertex][i] < Flow[CurVertex])

Flow[i] = c[CurVertex][i];

else

Flow[i] = Flow[CurVertex];

}

QP++;

}

if (Link[target] == -1) return 0;

CurVertex = target;

while (CurVertex != source) {

f[Link[CurVertex]][CurVertex] +=Flow[target];

CurVertex = Link[CurVertex];

}

return Flow[target];

}

int MaxFlow(int source, int target) {

memset(f, 0, sizeof(int)*MAX_VERTICES*MAX_VERTICES);

int MaxFlow = 0;

int AddFlow;

do {

AddFlow = FindPath(source, target);

MaxFlow += AddFlow;

} while (AddFlow >0);

return MaxFlow;

}

namespace Логика {

using namespace System;

using namespace System::ComponentModel;

using namespace System::Collections;

using namespace System::Windows::Forms;

using namespace System::Data;

using namespace System::Drawing;

/// <summary>

/// Summary for Form1

/// </summary>

public ref class Form1 : public System::Windows::Forms::Form

{

public:

Form1(void)

{

InitializeComponent();

//

//TODO: Add the constructor code here

//

}

protected:

/// <summary>

/// Clean up any resources being used.

/// </summary>

~Form1()

{

if (components)

{

delete components;

}

}

private: System::Windows::Forms::Button^ button1;

protected:

private: System::Windows::Forms::Button^ button2;

private: System::Windows::Forms::MenuStrip^ menuStrip1;

private: System::Windows::Forms::DataGridView^ dataGridView1;

private: System::Windows::Forms::PictureBox^ pictureBox1;

private: System::Windows::Forms::Button^ button3;

private: System::Windows::Forms::Button^ button4;

private: System::Windows::Forms::Label^ label1;

private: System::Windows::Forms::TextBox^ textBox1;

private: System::Windows::Forms::NumericUpDown^ numericUpDown1;

private: System::Windows::Forms::Label^ label2;

private: System::Windows::Forms::Label^ label3;

private: System::Windows::Forms::NumericUpDown^ numericUpDown2;

private: System::Windows::Forms::Label^ label4;

private: System::Windows::Forms::NumericUpDown^ numericUpDown3;

private:

/// <summary>

/// Required designer variable.

/// </summary>

System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

void InitializeComponent(void)

{

this->button1 = (gcnew System::Windows::Forms::Button());

this->button2 = (gcnew System::Windows::Forms::Button());

this->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());

this->dataGridView1 = (gcnew System::Windows::Forms::DataGridView());

this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());

this->button3 = (gcnew System::Windows::Forms::Button());

this->button4 = (gcnew System::Windows::Forms::Button());

this->label1 = (gcnew System::Windows::Forms::Label());

this->textBox1 = (gcnew System::Windows::Forms::TextBox());

this->numericUpDown1 = (gcnew System::Windows::Forms::NumericUpDown());

this->label2 = (gcnew System::Windows::Forms::Label());

this->label3 = (gcnew System::Windows::Forms::Label());

this->numericUpDown2 = (gcnew System::Windows::Forms::NumericUpDown());

this->label4 = (gcnew System::Windows::Forms::Label());

this->numericUpDown3 = (gcnew System::Windows::Forms::NumericUpDown());

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->dataGridView1))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->numericUpDown1))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->numericUpDown2))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->numericUpDown3))->BeginInit();

this->SuspendLayout();

//

// button1

//

this->button1->Location = System::Drawing::Point(11, 90);

this->button1->Name = L"button1";

this->button1->Size = System::Drawing::Size(124, 23);

this->button1->TabIndex = 0;

this->button1->Text = L"Случайные значения";

this->button1->UseVisualStyleBackColor = true;

this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

//

// button2

//

this->button2->Location = System::Drawing::Point(142, 90);

this->button2->Name = L"button2";

this->button2->Size = System::Drawing::Size(115, 23);

this->button2->TabIndex = 1;

this->button2->Text = L"Заполнить вручную";

this->button2->UseVisualStyleBackColor = true;

this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);

//

// menuStrip1

//

this->menuStrip1->Location = System::Drawing::Point(0, 0);

this->menuStrip1->Name = L"menuStrip1";

this->menuStrip1->Size = System::Drawing::Size(1018, 24);

this->menuStrip1->TabIndex = 2;

this->menuStrip1->Text = L"menuStrip1";

//

// dataGridView1

//

this->dataGridView1->AllowUserToAddRows = false;

this->dataGridView1->AllowUserToDeleteRows = false;

this->dataGridView1->AllowUserToResizeColumns = false;

this->dataGridView1->AllowUserToResizeRows = false;

this->dataGridView1->ColumnHeadersHeightSizeMode = System::Windows::Forms::DataGridViewColumnHeadersHeightSizeMode::AutoSize;

this->dataGridView1->Location = System::Drawing::Point(12, 119);

this->dataGridView1->Name = L"dataGridView1";

this->dataGridView1->ReadOnly = true;

this->dataGridView1->Size = System::Drawing::Size(245, 167);

this->dataGridView1->TabIndex = 3;

this->dataGridView1->CellEndEdit += gcnew System::Windows::Forms::DataGridViewCellEventHandler(this, &Form1::dataGridView1_CellEndEdit);

//

// pictureBox1

//

this->pictureBox1->BackColor = System::Drawing::SystemColors::HighlightText;

this->pictureBox1->Location = System::Drawing::Point(262, 20);

this->pictureBox1->Name = L"pictureBox1";

this->pictureBox1->Size = System::Drawing::Size(742, 402);

this->pictureBox1->TabIndex = 4;

this->pictureBox1->TabStop = false;

//

// button3

//

this->button3->Location = System::Drawing::Point(11, 292);

this->button3->Name = L"button3";

this->button3->Size = System::Drawing::Size(245, 23);

this->button3->TabIndex = 5;

this->button3->Text = L"Вывести граф";

this->button3->UseVisualStyleBackColor = true;

this->button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click);

//

// button4

//

this->button4->Location = System::Drawing::Point(11, 321);

this->button4->Name = L"button4";

this->button4->Size = System::Drawing::Size(245, 23);

this->button4->TabIndex = 6;

this->button4->Text = L"Рассчитать полный поток";

this->button4->UseVisualStyleBackColor = true;

this->button4->Click += gcnew System::EventHandler(this, &Form1::button4_Click);

//

// label1

//

this->label1->AutoSize = true;

this->label1->Location = System::Drawing::Point(9, 353);

this->label1->Name = L"label1";

this->label1->Size = System::Drawing::Size(82, 13);

this->label1->TabIndex = 7;

this->label1->Text = L"Полный поток:";

this->label1->Click += gcnew System::EventHandler(this, &Form1::label1_Click);

//

// textBox1

//

this->textBox1->Location = System::Drawing::Point(97, 350);

this->textBox1->Name = L"textBox1";

this->textBox1->ReadOnly = true;

this->textBox1->Size = System::Drawing::Size(159, 20);

this->textBox1->TabIndex = 8;

this->textBox1->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged);

//

// numericUpDown1

//

this->numericUpDown1->Location = System::Drawing::Point(141, 20);

this->numericUpDown1->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) {1, 0, 0, 0});

this->numericUpDown1->Name = L"numericUpDown1";

this->numericUpDown1->Size = System::Drawing::Size(65, 20);

this->numericUpDown1->TabIndex = 9;

this->numericUpDown1->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) {1, 0, 0, 0});

//

// label2

//

this->label2->AutoSize = true;

this->label2->Location = System::Drawing::Point(9, 22);

this->label2->Name = L"label2";

this->label2->Size = System::Drawing::Size(126, 13);

this->label2->TabIndex = 10;

this->label2->Text = L"Размерность матрицы:";

//

// label3

//

this->label3->AutoSize = true;

this->label3->Location = System::Drawing::Point(8, 48);

this->label3->Name = L"label3";

this->label3->Size = System::Drawing::Size(167, 13);

this->label3->TabIndex = 11;

this->label3->Text = L"Диапазон случайных значений:";

//

// numericUpDown2

//

this->numericUpDown2->Location = System::Drawing::Point(12, 64);

this->numericUpDown2->Name = L"numericUpDown2";

this->numericUpDown2->Size = System::Drawing::Size(58, 20);

this->numericUpDown2->TabIndex = 12;

this->numericUpDown2->ValueChanged += gcnew System::EventHandler(this, &Form1::numericUpDown2_ValueChanged);

//

// label4

//

this->label4->AutoSize = true;

this->label4->Location = System::Drawing::Point(85, 66);

this->label4->Name = L"label4";

this->label4->Size = System::Drawing::Size(10, 13);

this->label4->TabIndex = 13;

this->label4->Text = L"-";

//

// numericUpDown3

//

this->numericUpDown3->Location = System::Drawing::Point(116, 64);

this->numericUpDown3->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) {1, 0, 0, 0});

this->numericUpDown3->Name = L"numericUpDown3";

this->numericUpDown3->Size = System::Drawing::Size(61, 20);

this->numericUpDown3->TabIndex = 14;

this->numericUpDown3->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) {1, 0, 0, 0});

this->numericUpDown3->ValueChanged += gcnew System::EventHandler(this, &Form1::numericUpDown3_ValueChanged);

//

// Form1

//

this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

this->ClientSize = System::Drawing::Size(1018, 430);

this->Controls->Add(this->numericUpDown3);

this->Controls->Add(this->label4);

this->Controls->Add(this->numericUpDown2);

this->Controls->Add(this->label3);

this->Controls->Add(this->label2);

this->Controls->Add(this->numericUpDown1);

this->Controls->Add(this->textBox1);

this->Controls->Add(this->label1);

this->Controls->Add(this->button4);

this->Controls->Add(this->button3);

this->Controls->Add(this->pictureBox1);

this->Controls->Add(this->dataGridView1);

this->Controls->Add(this->button2);

this->Controls->Add(this->button1);

this->Controls->Add(this->menuStrip1);

this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::Fixed3D;

this->MainMenuStrip = this->menuStrip1;

this->MaximizeBox = false;

this->MinimizeBox = false;

this->Name = L"Form1";

this->Text = L"Полный поток";

this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->dataGridView1))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->numericUpDown1))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->numericUpDown2))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->numericUpDown3))->EndInit();

this->ResumeLayout(false);

this->PerformLayout();

}

#pragma endregion

private: void GenRand(int **Mass, int SizeMass) {

srand(time(NULL));

for (int i=0; i < SizeMass; i++) {

for (int j=0; j < SizeMass; j++) {

if((i==j)||(j<i)) continue;

Mass[i][j] = Convert::ToInt32(numericUpDown2->Value)+rand()%(Convert::ToInt32(numericUpDown3->Value)-Convert::ToInt32(numericUpDown2->Value)+1);;

Mass[j][i] = 0;

}

}

}

private: void ShowMass(int **Mass, int SizeMass) {

for (int i=0; i < SizeMass; i++) {

for (int j=0; j < SizeMass; j++) {

if (j==0)

{

dataGridView1->Columns[j]->HeaderCell->Value = "I";

}

else

{

if (j==SizeMass-1)

{

dataGridView1->Columns[j]->HeaderCell->Value = "S";

}

else

{

dataGridView1->Columns[j]->HeaderCell->Value = Convert::ToString(j+1);

}

}

if (i==0)

{

dataGridView1->Rows[i]->HeaderCell->Value = "I";

}

else

{

if (i==SizeMass-1)

{

dataGridView1->Rows[i]->HeaderCell->Value = "S";

}

else

{

dataGridView1->Rows[i]->HeaderCell->Value = Convert::ToString(i+1);

}

}

dataGridView1->Rows[i]->Cells[j]->Value = Mass[i][j];

}

}

}

private: void ShowGraph(int SizeMass) {

Graphics^ g = this->pictureBox1->CreateGraphics();

g->TextRenderingHint = System::Drawing::Text::TextRenderingHint::AntiAlias;

g->Clear(Color::White);

Brush^ Кисть = gcnew SolidBrush(Color::Red);

float Xc=371, Yc=201, A=311, B=141, e=sqrt(1-(pow(B,2)/pow(A,2))), Grad=180, Angle=Grad*M_PI/180, R=0, X=0, Y=0, Offset=0;

int **Coord = new int*[SizeMass];

for (int i=0; i<SizeMass; i++) {

Coord[i] = new int[2];

}

Offset=360/SizeMass;

for (int i=0;i<SizeMass;i++)

{

if(i==0)

{

R=B/(sqrt(1-pow(e,2)*pow(cos(180*M_PI/180),2)));

X=R*cos(180*M_PI/180)+Xc;

Y=R*sin(180*M_PI/180)+Yc;

Coord[i][0]=X;

Coord[i][1]=Y;

Grad+=Offset;

Angle=Grad*M_PI/180;

g->DrawEllipse(gcnew Pen(Color::Red),Coord[i][0],Coord[i][1],3,1);

g->DrawString("I", Font, Кисть, Coord[i][0]-15,Coord[i][1]);

continue;

}

if(i==SizeMass-1)

{

R=B/(sqrt(1-pow(e,2)*pow(cos(0*M_PI/180),2)));

X=R*cos(0*M_PI/180)+Xc;

Y=R*sin(0*M_PI/180)+Yc;

Coord[i][0]=X;

Coord[i][1]=Y;

Grad+=Offset;

Angle=Grad*M_PI/180;

g->DrawEllipse(gcnew Pen(Color::Red),Coord[i][0],Coord[i][1],3,1);

g->DrawString("S", Font, Кисть, Coord[i][0]+15,Coord[i][1]);

continue;

}

if((i+1)%2==0)

{

R=B/(sqrt(1-pow(e,2)*pow(cos(Angle),2)));

X=R*cos(Angle)+Xc;

Y=R*sin(Angle)+Yc;

Coord[i][0]=X;

Coord[i][1]=Y;

g->DrawEllipse(gcnew Pen(Color::Red),Coord[i][0],Coord[i][1],3,1);

g->DrawString(System::Convert::ToString(i+1), Font, Кисть, Coord[i][0],Coord[i][1]-15);

}

else

{

Grad*=-1;

Angle=Grad*M_PI/180;

R=B/(sqrt(1-pow(e,2)*pow(cos(Angle),2)));

X=R*cos(Angle)+Xc;

Y=R*sin(Angle)+Yc;

Coord[i][0]=X;

Coord[i][1]=Y;

Grad*=-1;

Grad+=Offset;

Angle=Grad*M_PI/180;

g->DrawEllipse(gcnew Pen(Color::Red),Coord[i][0],Coord[i][1],3,1);

g->DrawString(System::Convert::ToString(i+1), Font, Кисть, Coord[i][0],Coord[i][1]+15);

}

}

Кисть = gcnew SolidBrush(Color::Green);

for (int i = 0; i<SizeMass; i++) {

for (int j = 0; j<SizeMass; j++) {

if (Convert::ToInt32(dataGridView1->Rows[i]->Cells[j]->Value)> 0) {

g->DrawLine(gcnew Pen(Color::Black), Coord[i][0], Coord[i][1], Coord[j][0], Coord[j][1]);

Angle=atan2((float)(Coord[i][1]-Coord[j][1]),(float)(Coord[i][0]-Coord[j][0]));

if (Angle*180/M_PI<185&&Angle*180/M_PI>175) {

Xc=((Coord[j][0]-Coord[i][0])/2)-55+Coord[i][0];

Yc=((Coord[j][1]-Coord[i][1])/2)-20+Coord[i][1];

}

else {

if (-Angle*180/M_PI<95&&-Angle*180/M_PI>85) {

Xc=((Coord[j][0]-Coord[i][0])/2)-20+Coord[i][0];

Yc=((Coord[j][1]-Coord[i][1])/2)+55+Coord[i][1];

}

else {

Xc=((Coord[j][0]-Coord[i][0])/2)-20+Coord[i][0];

Yc=((Coord[j][1]-Coord[i][1])/2)-20+Coord[i][1];

}

}

g->DrawLine(gcnew Pen(Color::Black), Coord[j][0], Coord[j][1], Coord[j][0]+20*cos(Angle-(15*M_PI/180)), Coord[j][1]+20*sin(Angle-(15*M_PI/180)));

g->DrawLine(gcnew Pen(Color::Black), Coord[j][0], Coord[j][1], Coord[j][0]+20*cos(Angle+(15*M_PI/180)), Coord[j][1]+20*sin(Angle+(15*M_PI/180)));

g->DrawString(System::Convert::ToString(dataGridView1->Rows[i]->Cells[j]->Value)+"/"+System::Convert::ToString(dataGridView1->Rows[j]->Cells[i]->Value), Font, Кисть, Xc,Yc);

}

}

}

for (int i=0; i < SizeMass; i++) {

delete [] Coord[i];

}

delete [] Coord;

}

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {

}

private: System::Void сгенерироватьМатрицуToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {

button1->PerformClick();

}

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

dataGridView1->ReadOnly=true;

int SizeMass = Convert::ToInt32(numericUpDown1->Value);

int **Mass=new int *[SizeMass];

for(int i=0; i<SizeMass; i++) {

Mass[i]=new int[SizeMass];

}

for(int i=0;i<SizeMass;i++)

for(int j=0;j<SizeMass;j++)

Mass[i][j]=0;

dataGridView1->ColumnCount = SizeMass;

dataGridView1->RowCount = SizeMass;

dataGridView1->AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode::AutoSizeToAllHeaders);

dataGridView1->AutoResizeColumns();

GenRand(Mass,SizeMass);

ShowMass(Mass,SizeMass);

for (int i=0; i < SizeMass; i++) {

delete [] Mass[i];

}

delete [] Mass;

}

private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

dataGridView1->ReadOnly=false;

int SizeMass = Convert::ToInt32(numericUpDown1->Value);

int **Mass=new int *[SizeMass];

for(int i=0; i<SizeMass; i++) {

Mass[i]=new int[SizeMass];

}

for(int i=0;i<SizeMass;i++)

for(int j=0;j<SizeMass;j++)

Mass[i][j]=0;

dataGridView1->ColumnCount = SizeMass;

dataGridView1->RowCount = SizeMass;

dataGridView1->AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode::AutoSizeToAllHeaders);

dataGridView1->AutoResizeColumns();

ShowMass(Mass,SizeMass);

for (int i=0; i < SizeMass; i++) {

delete [] Mass[i];

}

delete [] Mass;

}

private: System::Void label1_Click(System::Object^ sender, System::EventArgs^ e) {

}

private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {

int SizeMass = dataGridView1->Rows->Count;

if (SizeMass==0) {

MessageBox::Show("Отсутствует граф для вывода!","Ошибка");

return;

}

ShowGraph(SizeMass);

}

private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {

int SizeMass = dataGridView1->Rows->Count;

for (int i = 0; i<SizeMass; i++) {

for (int j = 0; j<SizeMass; j++) {

c[i][j] = 0;

c[i][j] = Convert::ToInt32(dataGridView1->Rows[i]->Cells[j]->Value);

}

}

NUM_VERTICES = SizeMass;

source = 0;

target = (dataGridView1->Rows->Count)-1;

textBox1->Text = System::Convert::ToString(MaxFlow(source, target));

}

private: System::Void dataGridView1_CellEndEdit(System::Object^ sender, System::Windows::Forms::DataGridViewCellEventArgs^ e) {

int q,n;

if(!Int32::TryParse(Convert::ToString(dataGridView1->CurrentCell->Value),q)) {

MessageBox::Show("Матрица может состоять только из цифр!","Ошибка");

dataGridView1->CurrentCell->Value="0";

}

if((dataGridView1->CurrentRow->Index == dataGridView1->CurrentCell->ColumnIndex)&&(dataGridView1->CurrentCell->Value != "0")){

MessageBox::Show("Данная программа не предназначена для работы с петлями!","Ошибка");

dataGridView1->CurrentCell->Value="0";

}

}

private: System::Void numericUpDown2_ValueChanged(System::Object^ sender, System::EventArgs^ e) {

if ((Convert::ToInt32(numericUpDown2->Value)>(Convert::ToInt32(numericUpDown3->Value)))) {

MessageBox::Show("Превышение максимального значения!","Ошибка");

numericUpDown2->Value--;

}

}

private: System::Void numericUpDown3_ValueChanged(System::Object^ sender, System::EventArgs^ e) {

if ((Convert::ToInt32(numericUpDown2->Value)>(Convert::ToInt32(numericUpDown3->Value)))) {

numericUpDown2->Value=numericUpDown3->Value;

}

}

private: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) {

}

};

}

Размещено на Allbest.ru

...

Подобные документы

  • История создания алгоритма Форда-Фалкерсона, краткое описание его алгоритма, особенности работы, анализ сложности. Создание распараллеленного варианта алгоритма и его краткое описание. Основные характеристики теории графов, специфика, пути и маршруты.

    контрольная работа [246,3 K], добавлен 06.08.2013

  • Определение понятий - клика, подграф, неориентированный граф. Реализация алгоритма Брона-Кербоша псевдокодом для быстрого поиска клик. Описание классов для выполнения операций над графом и его матрицей. Использование в программе нестандартных компонентов.

    курсовая работа [410,1 K], добавлен 02.01.2011

  • Математические графы, области их применения. Способы раскраски вершин и ребер графов, задачи на их применение. Разработка алгоритма, работающего на основе операций с матрицей смежности. Описание логической структуры программы. Пример зарисовки графа.

    курсовая работа [145,5 K], добавлен 27.01.2013

  • Разработка программы нахождения оптимального пути обхода шахматной доски шахматным конем с обязательной визуализацией процесса и пошаговой демонстрацией. Тестирование графического интерфейса. Исходный код программы, составление и проверка алгоритма.

    курсовая работа [468,3 K], добавлен 11.12.2012

  • Анализ алгоритмов нахождения кратчайших маршрутов в графе без отрицательных циклов: Дейкстры, Беллмана-Форда и Флойда-Уоршалла. Разработка интерфейса программы на языке C++. Доказательство "правильности" работы алгоритма с помощью математической индукции.

    курсовая работа [1,5 M], добавлен 26.07.2013

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

    курсовая работа [372,6 K], добавлен 17.04.2014

  • Блок-схема алгоритма Флойда. Разработка его псевдокода в программе Microsoft Visual Studio. Программа реализации алгоритмов Беллмана-Форда. Анализ трудоемкости роста функции. Протокол тестирования правильности работы программы по алгоритму Флойда.

    курсовая работа [653,5 K], добавлен 18.02.2013

  • Последовательность формирования связного ациклического графа случайным образом в соответствии с заданным распределением. Вычисление потока минимальной стоимости. Генерация матрицы пропускных способностей. Реализация алгоритмов Фалкерсона, Дейкстры.

    курсовая работа [526,3 K], добавлен 14.12.2014

  • Свойства и виды алгоритмов. Составление программы, которая бы определила предыдущий и последующий символ для символа 'F' по таблице кодировки. Алгоритм нахождения максимального из двух значений. Программа замены местами в матрице элементов строк.

    курсовая работа [133,4 K], добавлен 16.05.2015

  • Программа формирования матрицы смежности по заданному списку окрестностей вершин ориентированного графа. Формирование динамического списка дуг ориентированного графа по заданному списку окрестностей. Анализ временной и емкостной сложности алгоритма.

    курсовая работа [8,1 M], добавлен 07.09.2012

  • Ввод данных в ячейку из раскрывающегося списка. Проверка содержимого ячеек при вводе данных с клавиатуры. Отмена проверки значения. Таблица после подведения промежуточных итогов. Консолидация данных и порядок ее выполнения, алгоритм и основные этапы.

    презентация [1,8 M], добавлен 29.09.2013

  • История создания, понятие, типы и функции системы управления базами данных. Изучение технологии копирования данных средствами устройства их хранения. Процесс разработки алгоритма и программы для нахождения максимального элемента массива А в массиве В.

    отчет по практике [360,4 K], добавлен 08.02.2014

  • Алгоритм функции формирования и проверки подписи. Интерфейс как аппаратная или программная система сопряжения объектов с различными характеристиками. Разработка программы, которая реализует процедуру подписи сообщения и процедуру проверки подписи.

    курсовая работа [150,0 K], добавлен 13.11.2009

  • Разработка алгоритма решения задачи численного интегрирования методом трапеции. Словесное описание и блок-схема разработанного алгоритма программы. Описание интерфейса, главного окна и основных форм программы. Проверка работоспособности программы.

    курсовая работа [1,4 M], добавлен 16.03.2012

  • Определение оптимального плана перевозок однородного груза из k-пунктов отправления в m-пункты назначения. Описание алгоритма нахождения потока минимальной стоимости. Решение транспортной задачи вручную и в среде MathCad, сравнение полученных результатов.

    курсовая работа [773,6 K], добавлен 09.12.2010

  • Графы: определения, примеры, способы изображения. Смежные вершины и рёбра. Путь в ориентированном и взвешенном графе. Матрица смежности и иерархический список. Алгоритм Дейкстры - алгоритм поиска кратчайших путей в графе. Работа в программе "ProGraph".

    презентация [383,8 K], добавлен 27.03.2011

  • Описание алгоритма решения транспортной задачи по планированию перевозки зерна. Ход решения задачи вручную, в программе TORA методом наименьшего элемента, с помощью MS Excel. Разработка программы для решения задачи в общем виде средствами Delphi.

    курсовая работа [2,5 M], добавлен 22.11.2012

  • Математическое описание операций преобразования плоских фигур. Выбор и обоснование языка программирования и среды разработки. Задание базовой фигуры. Разработка алгоритма работы программы. Проверка корректности работы программы в различных режимах.

    курсовая работа [567,6 K], добавлен 13.10.2014

  • Основные аналитические соотношения. Блок схемы и алгоритм решения задачи. Проверка работоспособности алгоритма вручную. Таблица идентификации переменных. Формы входной и выходной печати. Разработка и отладка программы. Инструкция для работы с программой.

    курсовая работа [69,8 K], добавлен 13.02.2012

  • Задача о кратчайшем пути как одна из важнейших классических задач теории графов. Общий обзор трех наиболее популярных алгоритмов для решения задачи о кратчайшем пути. Написание программы, которая реализует алгоритм Дейкстры и алгоритм Форда-Беллмана.

    курсовая работа [2,1 M], добавлен 23.06.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.