Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
28.06.2014
Размер:
18.4 Кб
Скачать
//---------------------------------------------------------------------------

#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