Лабораторные работы / Курсовая / Отчет
.docМосковский Энергетический Институт (Технический Университет)
Кафедра математического моделирования
Курсовая работа
по ЯПиМТ
«Графы»
Выполнил: Козлачкова М.Ю.,
А-14-08
Проверил: Зубов В.С.
2010г.
Задача:
Найти во взвешенном графе все пути из пункта A в пункт B, не большие заданного веса P.
Теоретические пояснения:
Граф – это абстрактное представление дискретной системы, состоящее из узлов (вершин) и ребер, выражающих отношения узлов.
Граф связен, если для любой пары узлов есть соединяющая их цепь.
Несвязный граф состоит из k 2 компонент связности – максимальных связных подграфов или изолированных узлов.
Метод:
Создаем две матрицы: одна отображается на форму – это матрица смежности, в другую записывается вес ребра в соответствии с вершинами, которые это ребро связывает.
В программе для поиска всех путей используется метод ветвей и границ. Это улучшенный метод поиска в глубину. Изменение очевидно – не продлевать цепь, если вес больше заданного, а делать шаг назад.
Тесты:
Внешний вид формы (отображен пример):
Поиск всех путей (вариант, когда все пути удовлетворяют поиску):
Поиск путей (вариант, когда один путь имеет вес больше заданного):
Поиск путей (вариант, когда нет искомых путей):
Текст программы:
//-------Unit1.h--------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TImage *Image1;
TStringGrid *StrGr1;
TEdit *Edit1;
TEdit *Edit2;
TEdit *Edit3;
TEdit *Edit4;
TButton *Button1;
TButton *Button2;
TEdit *Edit5;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TButton *Button3;
TButton *Button4;
TEdit *Edit6;
TButton *Button5;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
extern g=0;
extern m=1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
void F(int A[100][100],int nver,int vn, int vk, int P,int cep[],int &f)
{
int h = nver;
int R[100];
int St[100];
int i, j, k, t, s,d;
for (j=0;j<h+1;j++) R[j]=-1;
j = -1; k = 0; St[k] = vn; R[vn] = 1; int kk=-1; s=0; f=0;
do
{
t = St[k];
do
{
j++;
if (j>h)
break;
}
while(A[t][j]<=0);
if (j>h)
{
j = t;
k--;
R[t]=-1;
}
else
if (R[j]<0)
{
k++;
St[k] = j;
R[j] = 1;
if (j==vk)
{
s=0;
for(i=1;i<k+1;i++)
s = s + A[St[i-1]][St[i]];
if (s<P)
{
for(i=kk+1,d=0;i<kk+k+2,d<k+1;i++,d++)
cep[i] = St[d];
cep[kk+k+2]=-1;
f++;
kk=k+1;
}
}
j = -1;
}
}
while(k>=0);
}
//---------------------------------------------------------------------------
//-------Unit1.cpp--------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int nver = -1;
int ves[100][100];
struct Tochka
{
int x;
int y;
};
void VerPaint (int x, int y, int n)
{
Form1->Image1->Canvas->Pen->Color=0x00ff00;
Form1->Image1->Canvas->Ellipse(x-10,y-10,x+10,y+10);
Form1->Image1->Canvas->TextOutA(x-4,y-6,IntToStr(n));
}
void RebPaint (Tochka t1, Tochka t2, int ves)
{
Form1->Image1->Canvas->Pen->Color=0xffaa00;
Form1->Image1->Canvas->MoveTo(t1.x,t1.y);
Form1->Image1->Canvas->LineTo(t2.x,t2.y);
Form1->Image1->Canvas->TextOutA((t2.x+t1.x)/2,(t2.y+t1.y)/2,ves);
}
void PaintX (Tochka t1, Tochka t2)
{
Form1->Image1->Canvas->Pen->Color=0x0000aa;
Form1->Image1->Canvas->MoveTo(t1.x,t1.y);
Form1->Image1->Canvas->LineTo(t2.x,t2.y);
}
Tochka t[100];
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(Edit1->Text!="" && Edit2->Text!="")
{
nver++;
int n = nver;
t[n].x = StrToInt(Edit1->Text);
t[n].y = StrToInt(Edit2->Text);
StrGr1->Cells[0][n+1]=IntToStr(n);
StrGr1->Cells[n+1][0]=IntToStr(n);
StrGr1->Cells[n+1][n+1]="0";
for(int i=1;i<nver+2;i++)
{
StrGr1->Cells[i][n+1]="0";
StrGr1->Cells[n+1][i]="0";
}
VerPaint(t[n].x,t[n].y,n);
StrGr1->ColCount = n + 2;
StrGr1->RowCount = n + 2;
}
Edit1->Text = "";
Edit2->Text = "";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int v1, v2;
if(Edit3->Text!="" && Edit4->Text!="" && Edit5->Text!="")
{
v1 = StrToInt(Edit3->Text);
v2 = StrToInt(Edit4->Text);
ves[v1][v2] = ves[v2][v1] = StrToInt(Edit5->Text);
if(nver>0 && v1<=nver && v2<=nver)
{
StrGr1->Cells[v1+1][v2+1]=1;
StrGr1->Cells[v2+1][v1+1]=1;
}
RebPaint(t[v1],t[v2],ves[v1][v2]);
VerPaint(t[v1].x,t[v1].y,v1);
VerPaint(t[v2].x,t[v2].y,v2);
}
Edit3->Text = "";
Edit4->Text = "";
Edit5->Text = "";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
ves[i][j]=ves[j][i]=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
ves[i][j]=ves[j][i]=0;
Form1->Image1->Canvas->Rectangle(0,0,Form1->Image1->Width,Form1->Image1->Height);
nver=6;
t[0].x=100;t[0].y=100;
t[1].x=100;t[1].y=200;
t[2].x=160;t[2].y=230;
t[3].x=179;t[3].y=176;
t[4].x=234;t[4].y=210;
t[5].x=258;t[5].y=140;
StrGr1->ColCount = 7;
StrGr1->RowCount = 7;
for (int i=0;i<nver;i++)
{VerPaint(t[i].x,t[i].y,i);
}
for(int i=1;i<8;i++)
for(int j=1;j<8;j++)
{
StrGr1->Cells[i][j]="0";
}
for(int i=0;i<7;i++)
{
StrGr1->Cells[i+1][0]=IntToStr(i);
StrGr1->Cells[0][i+1]=IntToStr(i);
}
RebPaint(t[0],t[1],6); StrGr1->Cells[1][2]=1; StrGr1->Cells[2][1]=1;
RebPaint(t[2],t[1],13); StrGr1->Cells[3][2]=1; StrGr1->Cells[2][3]=1;
RebPaint(t[3],t[5],7); StrGr1->Cells[4][6]=1; StrGr1->Cells[6][4]=1;
RebPaint(t[2],t[0],12); StrGr1->Cells[3][1]=1; StrGr1->Cells[1][3]=1;
RebPaint(t[1],t[4],32); StrGr1->Cells[2][5]=1; StrGr1->Cells[5][2]=1;
RebPaint(t[2],t[5],18); StrGr1->Cells[3][6]=1; StrGr1->Cells[6][3]=1;
ves[0][1]=ves[1][0]=6;
ves[2][1]=ves[1][2]=13;
ves[3][5]=ves[5][3]=7;
ves[2][0]=ves[0][2]=12;
ves[1][4]=ves[4][1]=32;
ves[2][5]=ves[5][2]=18;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if(Edit3->Text!="" && Edit4->Text!="" && Edit5->Text!="")
{
Edit6->Text = "";
int n;
for(int i=0;i<nver;i++)
for(int j=0;j<nver;j++)
if(ves[i][j]!=0)
RebPaint(t[i],t[j],ves[i][j]);
int v1 = StrToInt(Edit3->Text);
int v2 = StrToInt(Edit4->Text);
int P = StrToInt(Edit5->Text);
int c[100];
F(ves,nver,v1,v2,P,c,n);
AnsiString str = "нет путей";
if (n!=0) str = "Больше " + str;
if (m<=n)
{
int s=0; int j;
j=g;
while (c[j]!=-1) {s++;j++;}
for(int i=g;i<g+s;i++)
Edit6->Text = Edit6->Text + IntToStr(c[i])+ " ";
for(int i=g+1;i<g+s;i++)
{
PaintX(t[c[i-1]],t[c[i]]);
}
g+=s+1;
m++;
}
else
{
ShowMessage(str);
m=1;
g=0;}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
ves[i][j]=ves[j][i]=0;
Form1->Image1->Canvas->Rectangle(0,0,Form1->Image1->Width,Form1->Image1->Height);
nver=6;
t[0].x=100;t[0].y=100;
t[1].x=100;t[1].y=200;
t[2].x=200;t[2].y=100;
t[3].x=200;t[3].y=200;
t[4].x=100;t[4].y=300;
t[5].x=200;t[5].y=300;
StrGr1->ColCount = 7;
StrGr1->RowCount = 7;
for (int i=0;i<nver;i++)
{VerPaint(t[i].x,t[i].y,i);
}
for(int i=1;i<8;i++)
for(int j=1;j<8;j++)
{
StrGr1->Cells[i][j]="0";
}
for(int i=0;i<7;i++)
{
StrGr1->Cells[i+1][0]=IntToStr(i);
StrGr1->Cells[0][i+1]=IntToStr(i);
}
RebPaint(t[0],t[1],6); StrGr1->Cells[1][2]=1; StrGr1->Cells[2][1]=1;
RebPaint(t[2],t[1],13); StrGr1->Cells[3][2]=1; StrGr1->Cells[2][3]=1;
RebPaint(t[2],t[0],12); StrGr1->Cells[3][1]=1; StrGr1->Cells[1][3]=1;
RebPaint(t[1],t[3],32); StrGr1->Cells[2][4]=1; StrGr1->Cells[4][2]=1;
RebPaint(t[4],t[5],18); StrGr1->Cells[5][6]=1; StrGr1->Cells[6][5]=1;
ves[0][1]=ves[1][0]=6;
ves[2][1]=ves[1][2]=13;
ves[2][0]=ves[0][2]=12;
ves[1][3]=ves[3][1]=32;
ves[4][5]=ves[5][4]=18;
}
//---------------------------------------------------------------------------