Добавил:
Tushkan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы / Захаров / LAB 3 / Unit3
.cpp//---------------------------------------------------------------------------
#include <vcl.h>
#include <string.h>
#pragma hdrstop
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString aFileName,St;
//---------------------------------------------------------------------------
int E[45][2]; // Матрица рёбер графа
int K[10]={1,2,3,4,5,6,7,8,9,10};
int w[45]; // Вектор весов рёбер
int L[45]; // Вектор номеров рёбер, упорядоченных по неубыванию весов
int MIN[9]; // Вектор номеров рёбер, входящих в минимальный остов
int n=0, m=0, i, Dub, Nmin;
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 (i=0; i < m; i++)
{
E[i][0]=0;
E[i][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;
Edit4->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;
Edit4->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 (i = 0; i < m; i++)
{
if ((E[i][0] == StrToInt(Edit2->Text)) && (E[i][1] == StrToInt(Edit3->Text)) ||
(E[i][1] == StrToInt(Edit2->Text)) && (E[i][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";
Edit4->Text="0";
Edit2->SetFocus();
Button7->Enabled=true;
m++;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender){Form1->Close();}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Button2->Enabled=false;
Edit2->Enabled=false;
Edit3->Enabled=false;
Edit4->Enabled=false;
// Условие задачи
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::SpeedButton3Click(TObject *Sender)
{
if (PrintDialog1->Execute())
RichEdit1->Print("Печать");
}
//---------------------------------------------------------------------------