Автор работы: Пользователь скрыл имя, 17 Ноября 2011 в 03:43, курсовая работа
Этот граф устроен следующим образом. Вершины его - знакомые юбиляра. Две вершины смежны, если соответствующие знакомые друг другу не симпатизируют. Нетрудно понять, что число независимости этого графа и представляет тот самый максимальный контингент приглашенных, который может себе позволить юбиляр.
Таким образом, задача поиска наибольшего независимого множества заключается в нахождении наибольшего количества несмежных между собой вершин графа. Данная программа предлагает 3 алгоритма решения этой задачи.
Введение 4
1.Математические методы 6
2.Постановка задачи 11
3.Разработка алгоритмов 12
3.1. Алгоритм Брона-Кэрбоша 12
3.2. Алгоритм Ткача 13
3.3. Алгоритм поиска η-областей 14
4.Описание программы 17
Выводы 19
Список использованных источников 20
Приложение А: Экранные формы 21
Приложение Б: код 22
Рисунок А.1: пустое рабочее поле
Рисунок А.2: загрузка графа из файла
Рисунок А.3: построение графа
Рисунок
А.4: поиск МНМ
//----------------------------
#define IMG
Form1->Image1->Canvas
#include <vcl.h>
#include <math.h>
#include <cstdio>
#include <conio.h>
#include <iostream.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const int N = 1000;
const int R = 6;
int QPnt = 0;
int QEdg = 0;
bool Select1 = false;
bool Select2 = false;
bool fBuild = true;
bool fMove = false;
int icurr, xm, ym;
int AdjMatr[50][50];
int MNM[50];
int MNM2[50];
int MNM3[50];
int size;
int size2;
struct XY
{
int x;
int y;
int inc;
}Points[N],edge1,edge2;
struct EDGE
{
XY p1;
XY p2;
}Edges[N];
struct STACK
{
int data[50];
int size;
};
void Push(STACK &a, int d)
{
a.size++;
a.data[a.size] = d;
}
int Pop(STACK &a)
{
int d;
d = a.data[a.size];
a.data[a.size] = 0;
a.size--;
return d;
}
void CleanWind()
{
QPnt = 0;
QEdg = 0;
Select1 = false;
Select2 = false;
IMG->Brush->Color = clWhite;
IMG->FillRect(Form1->Image1->
IMG->Brush->Color = clBlack;
IMG->FrameRect(Form1->Image1->
}
void PutPoint(int x, int y)
{
IMG->Ellipse(x-R,y-R,x+R,y+R);
Points[QPnt].x = x;
Points[QPnt].y = y;
QPnt++;
}
void PutEdge(XY pnt1, XY pnt2)
{
IMG->MoveTo(pnt1.x,pnt1.y);
IMG->LineTo(pnt2.x,pnt2.y);
Edges[QEdg].p1 = pnt1;
Edges[QEdg].p2 = pnt2;
QEdg++;
}
void DelEdge(int i_del)
{
IMG->Pen->Color = clWhite;
for (int i=0; i<QEdg; i++)
{
IMG->MoveTo(Points[icurr].x,
if ((Edges[i].p1.x==Points[i_del]
{
IMG->LineTo(Edges[i].p2.x,
for (int j = i; j<QEdg-1; j++)
Edges[j] = Edges[j+1];
QEdg--;
i--;
}
IMG->MoveTo(Points[icurr].x,
if ((Edges[i].p2.x==Points[i_del]
{
IMG->LineTo(Edges[i].p1.x,
for (int j = i; j<QEdg-1; j++)
Edges[j] = Edges[j+1];
QEdg--;
i--;
}
}
}
void DelPoint(int i_del)
{
DelEdge(i_del);
IMG->Pen->Color = clWhite;
IMG->Brush->Color = clWhite;
IMG->Ellipse(Points[i_del].x-
for (int i = i_del; i<QPnt-1; i++)
Points[i] = Points[i+1];
QPnt--;
}
void Tkach()
{
int i=0;
int j=0;
size = QPnt;
for (int y = 0; y<QPnt; y++)
MNM[y] = y;
for (int Ki = 0; Ki<size; Ki++)
{
i = MNM[Ki];
for (int Kj = 0; Kj<size; Kj++)
{
j = MNM[Kj];
if (AdjMatr[i][j]==1)
{
int s1=0,s2=0;
for (int j1=0; j1<size; j1++)
s1+=AdjMatr[i][MNM[j1]];
for (int i1=0; i1<size; i1++)
s2+=AdjMatr[MNM[i1]][j];
if (s2>=s1)
{
for (int k=Kj; k<size-1; k++)
MNM[size-1]=0;
size--;
Kj--;
}
if (s2<s1)
{
for (int k=Ki; k<size-1; k++)
MNM[size-1]=0;
size--;
Ki--;
break;
}
}
}
}
}
void Bron()
{
STACK comp;
int elem[10];
comp.size = -1;
int ne = 0;
int ce = QPnt-1;
for (int i = 0; i<QPnt; i++)
elem[i] = i;
int cnt = 1;
bool newn = true;
size2 = 0;
int lim = QPnt-1;
while (ne!=(QPnt-1))
{
if (newn)
{
Push(comp,elem[ne]);
newn = false;
lim = QPnt-1;
for (int i=QPnt-1; i>=0; i--)
if (AdjMatr[ne][i]==0)
{
ce = i;
break;
}
}
for (int i=ne+1; i<=lim; i++)
{
bool f=true;
for (int k=0; k<=comp.size; k++)
if (AdjMatr[comp.data[k]][i]==1)
{
f=false;
break;
}
if (f)
Push(comp,i);
}
if (size2 < comp.size+1)
{
size2 = comp.size+1;
for (int i=0; i<=comp.size; i++)
MNM2[i] = comp.data[i];
}
if (ne!=ce)
{
ne = Pop(comp);
lim = ce;
}
else
{
ne = cnt;
cnt++;
comp.size = -1;
if ((QPnt-ne)<=size2) return;
newn = true;
}
}
}
void Eta()
{
for (int i=0; i<QPnt; i++)
MNM3[i]=i;
bool flag = false, f1=false,f2=false;
int sp1,se1,sp2,se2;
while (!flag)