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

Московский Энергетический Институт (Технический Университет)

Кафедра математического моделирования

Курсовая работа

по ЯПиМТ

«Графы»

Выполнил: Козлачкова М.Ю.,

А-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;

}

//---------------------------------------------------------------------------