Добавил:
Tushkan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы / Захаров / LAB 1 / Unit1
.cpp//---------------------------------------------------------------------------
#include <vcl.h>
#include <string.h>
#pragma hdrstop
#include "Unit1.h"
#include <dos.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString aFileName,St;
//---------------------------------------------------------------------------
int E[45][2]; //Матрица рёбер графа
int A[10][10],B[10][45]; //Матрицы смежностей и инциденций
int E1[45],V1[10]; //Вспомогательные векторы
int n=0, m=0, i, j, S, f1, f2, nS, mS, jS, iS, k1, k2, num, Dub, Nmin;
int w[45]; // Вектор весов рёбер
int L[45]; // Вектор номеров рёбер, упорядоченных по неубыванию весов
int MIN[9]; // Вектор номеров рёбер, входящих в минимальный остов
bool fl;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
aFileName = "";
SpeedButton1->OnClick = imOpenClick;
SpeedButton2->OnClick = imSaveClick;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::imOpenClick(TObject *Sender)
{
OpenDialog1->FileName = "*.txt";
OpenDialog1->Options<<ofPathMustExist<<ofFileMustExist;
if (OpenDialog1->Execute())
{
RichEdit1->Lines->Clear();
RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);
aFileName=OpenDialog1->FileName;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::imSaveClick(TObject *Sender)
{
aFileName = "Результат";
SaveDialog1->FileName = aFileName;
if (SaveDialog1->Execute())
{
switch (SaveDialog1->FilterIndex)
{
case 1 : aFileName+=".txt"; break;
case 2 : aFileName+=".doc"; break;
}
RichEdit1->Lines->SaveToFile (aFileName);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
for (j=0; j < m; j++)
{
E[j][0]=0;
E[j][1]=0;
}
n=m=0;
Button7->Enabled=false;
Button6->Enabled=false;
Button2->Enabled=false;
Button1->Enabled=true;
Edit1->Enabled=true;
Edit2->Enabled=false;
Edit3->Enabled=false;
Edit1->Text="0";
Edit1->SetFocus();
RichEdit1->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ((StrToInt(Edit1->Text) <= 10) && StrToInt(Edit1->Text))
{
n=StrToInt(Edit1->Text);
Button1->Enabled=false;
Button2->Enabled=true;
Button6->Enabled=true;
Edit1->Enabled=false;
Edit2->Enabled=true;
Edit3->Enabled=true;
}
else
{
MessageDlg("Число вершин не может превышать 10 или равняться 0!",mtError,TMsgDlgButtons()<<mbOK,0);
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if ((Edit2->Text>n) || (Edit2->Text<1) || (Edit3->Text>n) || (Edit3->Text < 1))
{
MessageDlg("Вершин, формирующих ребро, нет!",mtError,TMsgDlgButtons()<<mbOK,0);
Edit2->SetFocus();
return;
}
else
{
for (j = 0; j < m; j++)
{
if ((E[j][0] == StrToInt(Edit2->Text)) && (E[j][1] == StrToInt(Edit3->Text)) ||
(E[j][1] == StrToInt(Edit2->Text)) && (E[j][0] == StrToInt(Edit3->Text)))
{
MessageDlg("Такое ребро уже существует!",mtError,TMsgDlgButtons()<<mbOK,0);
Edit2->SetFocus();
return;
}
}
E[m][0]=StrToInt(Edit2->Text);
E[m][1]=StrToInt(Edit3->Text);
w[m]=(E[m][0]+E[m][1])%10;
Edit2->Text="0";
Edit3->Text="0";
Edit2->SetFocus();
Button7->Enabled=true;
m++;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Button2->Enabled=false;
Edit2->Enabled=false;
Edit3->Enabled=false;
Panel2->Visible=true;
if (num==1)
{
// Неориентированный граф
RichEdit1->Lines->Clear();
RichEdit1->Lines->Add("НЕОРИЕНТИРОВАННЫЙ ГРАФ");
RichEdit1->Lines->Add("");
RichEdit1->Lines->Add("G=(V,E)");
St="V={1";
for (i=2; i <= n; i++) St=St+","+IntToStr(i);
St+="}";
RichEdit1->Lines->Add(St);
St="E={("+IntToStr(E[0][0])+","+IntToStr(E[0][1])+")";
for(j=1; j < m; j++) St=St+",("+IntToStr(E[j][0])+","+IntToStr(E[j][1])+")";
St+="}";
RichEdit1->Lines->Add(St);
for (i = 0; i < 15; i++)
RichEdit1->Lines->Add("");
St="";
// Формирование матрицы смежностей А
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
A[i][j] = 0;
for (j = 0; j < m; j++)
{
A[E[j][0]-1][E[j][1]-1] = A[E[j][1]-1][E[j][0]-1] = 1;
}
RichEdit1->Lines->Add("Матрица смежностей А ");
for (i=0; i < n; i++)
{
for (j=0; j < n; j++)
St=St+IntToStr(A[i][j])+" ";
RichEdit1->Lines->Add(St);
St = "";
}
for (i = n; i < 12; i++)
RichEdit1->Lines->Add("");
// Формирование матрицы инциденций В
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
B[i][j] = 0;
for (j = 0; j < m; j++)
B[E[j][0]-1][j] = B[E[j][1]-1][j] = 1;
RichEdit1->Lines->Add("Матрица инциденций В ");
for (i=0; i < n; i++)
{
for (j=0; j < m; j++)
St=St+IntToStr(B[i][j])+" ";
RichEdit1->Lines->Add(St);
St = "";
}
for (i = n; i < 12; i++)
RichEdit1->Lines->Add("");
// Маршрут
St="Маршрут ";
randomize();
S = random (10)+6; // Число шагов
f1 = random (n); // Генерация первой вершины
St=St+" V"+IntToStr(f1+1);
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; A[f1][f2] == 0; f2=random(n));
for (j=0; j < m; j++)
if ((E[j][0]==(f1+1))&&(E[j][1]==(f2+1))||(E[j][1]==(f1+1))&&(E[j][0]==(f2+1)))
{
St=St+" e"+IntToStr(j+1);
f1 = f2;
St=St+" V"+IntToStr(f2+1);
}
}
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
// Цепь
St="Цепь ";
S = random (10)+6; // Число шагов
f1 = random (n); // Генерация первой вершины
St=St+" V"+IntToStr(f1+1);
mS=0;
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; A[f1][f2] == 0; f2=random(n));
for (j=0; j < m; j++)
if ((E[j][0]==(f1+1))&&(E[j][1]==(f2+1))||
(E[j][1]==(f1+1))&&(E[j][0]==(f2+1)))
{
fl=true;
for (jS=0; jS < mS; jS++)
if (E1[jS] == (j+1)) fl=false;
if (fl==true)
{
St=St+" e"+IntToStr(j+1);
E1[mS]=j+1;
mS++;
f1 = f2;
St=St+" V"+IntToStr(f2+1);
}
}
}
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
// Простая цепь
St="Простая цепь";
S = random (10)+6; // Число шагов
f1 = random (n); // Генерация первой вершины
St=St+" V"+IntToStr(f1+1);
mS=0;
nS=1;
V1[0]=f1+1;
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; A[f1][f2] == 0; f2=random(n));
for (j=0; j < m; j++)
if ((E[j][0]==(f1+1))&&(E[j][1]==(f2+1))||
(E[j][1]==(f1+1))&&(E[j][0]==(f2+1)))
{
fl=true;
for (jS=0; jS < mS; jS++)
if (E1[jS] == (j+1)) fl=false;
for (iS=0; iS < nS; iS++)
if (V1[iS] == (f2+1)) fl=false;
if (fl==true)
{
St=St+" e"+IntToStr(j+1);
E1[mS]=j+1;
V1[nS]=f2+1;
mS++;
nS++;
f1 = f2;
St=St+" V"+IntToStr(f2+1);
}
}
}
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
// Цикл
do
{
St="Цикл ";
S = random (10)+6;
k1 = f1 = random (n);
St=St+" V"+IntToStr(f1+1);
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; A[f1][f2] == 0; f2=random(n));
for (j=0; j < m; j++)
if ((E[j][0]==(f1+1))&&(E[j][1]==(f2+1))||
(E[j][1]==(f1+1))&&(E[j][0]==(f2+1)))
{
St=St+" e"+IntToStr(j+1);
k2 = f1 = f2;
St=St+" V"+IntToStr(f2+1);
if (k1 == k2) i = S;
}
}
}
while (k1!=k2);
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
// Простой цикл
do
{
St="Простой цикл";
S = random (15)+1;
k1 = f1 = random (n);
St=St+" V"+IntToStr(f1+1);
mS=0;
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; A[f1][f2] == 0; f2=random(n));
for (j=0; j < m; j++)
if ((E[j][0]==(f1+1))&&(E[j][1]==(f2+1))||
(E[j][1]==(f1+1))&&(E[j][0]==(f2+1)))
{
fl=true;
for (jS=0; jS < mS; jS++)
if (E1[jS] == (j+1)) fl=false;
if (fl==true)
{
St=St+" e"+IntToStr(j+1);
E1[mS]=j+1;
V1[nS]=f2+1;
mS++;
nS++;
k2 = f1 = f2;
St=St+" V"+IntToStr(f2+1);
if (k1 == k2) i = S;
}
}
}
}
while (k1!=k2);
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
// Преобразование неориентированного графа в ориентированный
for (j=0; j < m; j++)
{
if (random(2) == 0)
{
S=E[j][0];
E[j][0]=E[j][1];
E[j][1]=S;
}
}
// Ориентированный граф
RichEdit1->Lines->Add("ОРИЕНТИРОВАННЫЙ ГРАФ");
RichEdit1->Lines->Add("");
RichEdit1->Lines->Add("G=(V,E)");
St="V={1";
for (i=2; i <= n; i++) St=St+","+IntToStr(i);
St+="}";
RichEdit1->Lines->Add(St);
St="E={("+IntToStr(E[0][0])+","+IntToStr(E[0][1])+")";
for(j=1; j < m; j++) St=St+",("+IntToStr(E[j][0])+","+IntToStr(E[j][1])+")";
St+="}";
RichEdit1->Lines->Add(St);
for (i = 0; i < 15; i++)
RichEdit1->Lines->Add("");
St="";
// Формирование матрицы смежностей А
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
A[i][j] = 0;
for (j = 0; j < m; j++)
{
A[E[j][0]-1][E[j][1]-1] = 1;
A[E[j][1]-1][E[j][0]-1] = -1;
}
RichEdit1->Lines->Add("Матрица смежностей А ");
for (i=0; i < n; i++)
{
for (j=0; j < n; j++)
{
if ((A[i][j]==0)||(A[i][j]==1)) St+=" ";
St=St+IntToStr(A[i][j])+" ";
}
RichEdit1->Lines->Add(St);
St = "";
}
for (i = n; i < 12; i++)
RichEdit1->Lines->Add("");
// Формирование матрицы инциденций В
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
B[i][j] = 0;
for (j = 0; j < m; j++)
{
B[E[j][0]-1][j] = 1;
B[E[j][1]-1][j] = -1;
}
RichEdit1->Lines->Add("");
RichEdit1->Lines->Add("Матрица инциденций В ");
for (i=0; i < n; i++)
{
for (j=0; j < m; j++)
{
if ((B[i][j]==0)||(B[i][j]==1)) St+=" ";
St=St+IntToStr(B[i][j])+" ";
}
RichEdit1->Lines->Add(St);
St = "";
}
for (i = n; i < 12; i++)
RichEdit1->Lines->Add("");
// Ормаршрут
St="Ормаршрут ";
randomize();
S = random (30)+6; // Число шагов
f1 = random (n); // Генерация первой вершины
St=St+" V"+IntToStr(f1+1);
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; ((A[f1][f2] == 0)||(A[f1][f2] == -1))&&(i<S); f2=random(n), i++);
for (j=0; j < m; j++)
if (E[j][0]==(f1+1)&&E[j][1]==(f2+1))
{
St=St+" e"+IntToStr(j+1);
f1 = f2;
St=St+" V"+IntToStr(f2+1);
}
}
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
// Путь
St="Путь ";
S = random (30)+6; // Число шагов
f1 = random (n); // Генерация первой вершины
St=St+" V"+IntToStr(f1+1);
mS=0;
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; ((A[f1][f2] == 0)||(A[f1][f2] == -1))&&(i<S); f2=random(n), i++);
for (j=0; j < m; j++)
if (E[j][0]==(f1+1)&&E[j][1]==(f2+1))
{
fl=true;
for (jS=0; jS < mS; jS++)
if (E1[jS] == (j+1)) fl=false;
if (fl==true)
{
St=St+" e"+IntToStr(j+1);
E1[mS]=j+1;
mS++;
f1 = f2;
St=St+" V"+IntToStr(f2+1);
}
}
}
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
// Простой путь
St="Простой путь ";
S = random (30)+6; // Число шагов
f1 = random (n); // Генерация первой вершины
St=St+" V"+IntToStr(f1+1);
mS=0;
nS=1;
V1[0]=f1+1;
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; ((A[f1][f2] == 0)||(A[f1][f2] == -1))&&(i<S); f2=random(n), i++);
for (j=0; j < m; j++)
if ((E[j][0]==(f1+1))&&(E[j][1]==(f2+1)))
{
fl=true;
for (jS=0; jS < mS; jS++)
if (E1[jS] == (j+1)) fl=false;
for (iS=0; iS < nS; iS++)
if (V1[iS] == (f2+1)) fl=false;
if (fl==true)
{
St=St+" e"+IntToStr(j+1);
E1[mS]=j+1;
V1[nS]=f2+1;
mS++;
nS++;
f1 = f2;
St=St+" V"+IntToStr(f2+1);
}
}
}
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
// Контур
int Try1=0;
do
{
St="Контур ";
S = random (30)+6;
k1 = f1 = random (n);
St=St+" V"+IntToStr(f1+1);
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; ((A[f1][f2] == 0)||(A[f1][f2] == -1))&&(i<S); f2=random(n), i++);
for (j=0; j < m; j++)
if ((E[j][0]==(f1+1))&&(E[j][1]==(f2+1)))
{
St=St+" e"+IntToStr(j+1);
k2 = f1 = f2;
St=St+" V"+IntToStr(f2+1);
if (k1 == k2) i = S;
}
}
Try1++;
}
while (k1!=k2&&Try1<20 || nS==1);
if (k1!=k2)
St="Контур отсутствует";
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
// Простой контур
Try1=0;
do
{
St="Простой контур";
S = random (15)+1;
k1 = f1 = random (n);
St=St+" V"+IntToStr(f1+1);
mS=0;
for (i = 0; i < S; i++)
{
f2 = random (n);
for ( ; ((A[f1][f2] == 0)||(A[f1][f2] == -1))&&(i<S); f2=random(n), i++);
for (j=0; j < m; j++)
if ((E[j][0]==(f1+1))&&(E[j][1]==(f2+1)))
{
fl=true;
for (jS=0; jS < mS; jS++)
if (E1[jS] == (j+1)) fl=false;
if (fl==true)
{
St=St+" e"+IntToStr(j+1);
E1[mS]=j+1;
mS++;
k2 = f1 = f2;
St=St+" V"+IntToStr(f2+1);
if (k1 == k2) i = S;
}
}
}
Try1++;
}
while (k1!=k2&&Try1<20);
if (k1!=k2)
St="Простой контур отсутствует";
RichEdit1->Lines->Add(St);
RichEdit1->Lines->Add("");
return;
}
if (num==3)
{
int K[10]={1,2,3,4,5,6,7,8,9,10};
// Условие задачи
RichEdit1->Lines->Clear();
RichEdit1->Lines->Add("Имеется неориентированный граф G.");
RichEdit1->Lines->Add("");
RichEdit1->Lines->Add("G=(V,E,w)");
St="V={1";
for (i=2; i <= n; i++) St=St+","+IntToStr(i);
St+="}";
RichEdit1->Lines->Add(St);
St="E={("+IntToStr(E[0][0])+","+IntToStr(E[0][1])+")";
for(i=1; i < m; i++) St=St+",("+IntToStr(E[i][0])+","+IntToStr(E[i][1])+")";
St+="}";
RichEdit1->Lines->Add(St);
St="w={"+IntToStr(w[0]);
for(i=1; i < m; i++) St=St+","+IntToStr(w[i]);
St+="}";
RichEdit1->Lines->Add(St);
for (i = 0; i < 15; i++)
RichEdit1->Lines->Add("");
St="";
//Упорядочивание рёбер по не убыванию весов
for (i = 0; i < m; i++)
L[i]=i;
fl=true;
while (fl)
{
fl = false;
for (i = 0; i < m-1; i++)
if (w[L[i]]>w[L[i+1]])
{
Dub=L[i];
L[i]=L[i+1];
L[i+1]=Dub;
fl=true;
}
}
//Поиск остова минимального веса (алгоритм Краскала)
Nmin=0;
i=0;
while (Nmin<(n-1))
{
if (K[E[L[i]][0]-1]!=K[E[L[i]][1]-1])
{
K[E[L[i]][0]-1]=K[E[L[i]][1]-1];
MIN[Nmin]=L[i]+1;
Nmin++;
}
i++;
}
St="Минимальный остов e"+IntToStr(MIN[0]);
for(i=1; i < Nmin; i++) St=St+" e"+IntToStr(MIN[i]);
RichEdit1->Lines->Add(St);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, wchar_t &Key)
{
if ((Key>='0')&&(Key<='9') || (Key == VK_BACK)) return;
Key = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, wchar_t &Key)
{
if ((Key>='0')&&(Key<='9') || (Key==VK_BACK)) return;
Key = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
if (PrintDialog1->Execute())
RichEdit1->Print("Печать");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton8Click(TObject *Sender) {Form1->Close();}
//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton4MouseEnter(TObject *Sender)
{
SpeedButton4->Left=340;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton4MouseLeave(TObject *Sender)
{
SpeedButton4->Left=356;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton5MouseEnter(TObject *Sender)
{
SpeedButton5->Left=340;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton5MouseLeave(TObject *Sender)
{
SpeedButton5->Left=356;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton6MouseEnter(TObject *Sender)
{
SpeedButton6->Left=340;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton6MouseLeave(TObject *Sender)
{
SpeedButton6->Left=356;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton7MouseEnter(TObject *Sender)
{
SpeedButton7->Left=340;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton7MouseLeave(TObject *Sender)
{
SpeedButton7->Left=356;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton8MouseEnter(TObject *Sender)
{
SpeedButton8->Left=340;
}//---------------------------------------------------------------------------
void __fastcall TForm1::peedButton8MouseLeave(TObject *Sender)
{
SpeedButton8->Left=356;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
num=1;
Panel1->Visible=true;
Panel2->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton5Click(TObject *Sender)
{
num=2;
Panel1->Visible=true;
Panel2->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton6Click(TObject *Sender)
{
num=3;
Panel1->Visible=true;
Panel2->Visible=false;
}
//---------------------------------------------------------------------------
Соседние файлы в папке LAB 1