Автор работы: Пользователь скрыл имя, 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)