Поиск максимального независимого множества графа с помощью алгоритмов Брона-Кэрбоша, Ткача, алгоритма поиска η-областей

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

Note.docx

— 255.41 Кб (Скачать документ)

}

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

void __fastcall TForm1::BDoneClick(TObject *Sender)

{

        IMG->Brush->Color = clBlack;

        IMG->Ellipse(Points[icurr].x-R,Points[icurr].y-R,Points[icurr].x+R,Points[icurr].y+R);

        fBuild = false;

        BRed->Enabled = true;

        BRest->Enabled = false;

        BTkach->Enabled = true;

        BBron->Enabled = true;

        BEta->Enabled = true;

        BDone->Enabled = false; 

        for (int i=0; i<QPnt; i++)

           for (int j=0; j<QPnt; j++)

                AdjMatr[i][j] = 0; 

        for (int i = 0; i<QEdg; i++)

        {

            AdjMatr[Edges[i].p1.inc][Edges[i].p2.inc] = 1;

            AdjMatr[Edges[i].p2.inc][Edges[i].p1.inc] = 1;

        }

        Tkach();

}

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

void __fastcall TForm1::Image1MouseDown(TObject *Sender,

      TMouseButton Button, TShiftState Shift, int X, int Y)

{

     float d = sqrt((X-Points[icurr].x)*(X-Points[icurr].x) + (Y-Points[icurr].y)*(Y-Points[icurr].y));

     if (Select1 && (d<=R))

     {

        fMove = true;

        Select1 = false;

        xm = Points[icurr].x;

        ym = Points[icurr].y;

        IMG->Brush->Color = clWhite;

        IMG->Pen->Color = clWhite;

        IMG->Ellipse(xm-R,ym-R,xm+R,ym+R); 

        for (int i=0; i<QEdg; i++)

        {

                 IMG->Pen->Color = clWhite;

                 IMG->MoveTo(Points[icurr].x,Points[icurr].y);

                 if ((Edges[i].p1.x==xm)&&(Edges[i].p1.y==ym))

                        IMG->LineTo(Edges[i].p2.x,Edges[i].p2.y);

                 if ((Edges[i].p2.x==xm)&&(Edges[i].p2.y==ym))

                        IMG->LineTo(Edges[i].p1.x,Edges[i].p1.y);

        }

     }

}

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

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,

      TShiftState Shift)

{

        if ((Key == VK_DELETE)&&(Select1))

        {

                Select1 = false;

                DelPoint(icurr);

                IMG->Pen->Color = clBlack;

        }

        if ((Key == VK_ESCAPE)&&(Select1))

        {

                IMG->Brush->Color = clBlack;

                IMG->Pen->Color = clBlack;

                IMG->Ellipse(edge1.x-R,edge1.y-R,edge1.x+R,edge1.y+R);

                Select1 = false;

        }

}

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

void __fastcall TForm1::BTkachClick(TObject *Sender)

{

        Tkach();

        for (int i = 0; i<size; i++)

        {

            IMG->Brush->Color = clYellow;

            IMG->Ellipse(Points[MNM[i]].x-R,Points[MNM[i]].y-R,Points[MNM[i]].x+R,Points[MNM[i]].y+R);

        }

}

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

void __fastcall TForm1::BSave2Click(TObject *Sender)

{

       if (SaveDialog2->Execute())

                Form1->Image1->Picture->SaveToFile(SaveDialog2->FileName);

}

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

void __fastcall TForm1::BSave1Click(TObject *Sender)

{

        AnsiString s;

        char fname[50];

        FILE *fout;

        if (SaveDialog1->Execute())

                s = SaveDialog1->FileName; 

        if (s.Length()!=0)

        {

                strcpy(fname,s.c_str());

                fout = fopen(fname, "wt");

                fprintf(fout, "%d \n", QPnt);

                for (int i=0; i<QPnt; i++)

                {

                        fprintf(fout, "%4d", Points[i].x);

                        fprintf(fout, "%4d", Points[i].y);

                        fprintf(fout, "\n");

                }

                fprintf(fout, "%d \n", QEdg);

                for (int i=0; i<QEdg; i++)

                {

                        fprintf(fout, "%2d", Edges[i].p1.inc);

                        fprintf(fout, "%2d", Edges[i].p2.inc);

                        fprintf(fout, "\n");

                }

                fclose(fout);

        }

}

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

void __fastcall TForm1::BOpenClick(TObject *Sender)

{

        AnsiString s;

        char fname[50];

        if (OpenDialog1->Execute())

                s = OpenDialog1->FileName; 

        if (s.Length()!=0)

        {

            CleanWind();

            FILE *fin;

            strcpy(fname,s.c_str());

            fin = fopen(fname, "rt"); 

            int Q1,Q2;

            char line[50];

            fgets(line, 50, fin);

          sscanf(line, "%d", &Q1);

            for (int i=0; i<Q1; i++)

            {

                int x1,y1;

                fgets(line, 50, fin);

                sscanf(line, "%d %d", &x1, &y1);

                PutPoint(x1,y1);

            } 

            fgets(line, 50, fin);

            sscanf(line, "%d", &Q2);

            for (int i=0; i<Q2; i++)

            {

                int p1,p2;

                fgets(line, 50, fin);

                sscanf(line, "%d %d", &p1, &p2);

                PutEdge(Points[p1],Points[p2]);

                Edges[QEdg-1].p1.inc = p1;

                Edges[QEdg-1].p2.inc = p2;

            }

            fclose(fin);

        }

        fBuild = true;

        BRest->Enabled = true;

        BDone->Enabled = true;

        BRed->Enabled = false;

        BTkach->Enabled = false;

        BBron->Enabled = false;

        BEta->Enabled = false;

        Select1 = false;

        Select2 = false;

}

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

void __fastcall TForm1::BBronClick(TObject *Sender)

{

        Bron();

        IMG->Brush->Color = clYellow;

        for (int i = 0; i<size2; i++)

            IMG->Ellipse(Points[MNM2[i]].x-R,Points[MNM2[i]].y-R,Points[MNM2[i]].x+R,Points[MNM2[i]].y+R); 

}

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

void __fastcall TForm1::BEtaClick(TObject *Sender)

{

        Eta();

        IMG->Brush->Color = clYellow;

        for (int k = 0; k<QPnt; k++)

        {

                bool flag=true;

                for (int i = 0; i<k; i++)

                   if ((AdjMatr[k][i]==1)||(AdjMatr[i][k]==1))

                   {

                        flag=false;

                        break;

                   }

                if (flag)

                   IMG->Ellipse(Points[MNM3[k]].x-R,Points[MNM3[k]].y-R,Points[MNM3[k]].x+R,Points[MNM3[k]].y+R);

        }

}

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

Информация о работе Поиск максимального независимого множества графа с помощью алгоритмов Брона-Кэрбоша, Ткача, алгоритма поиска η-областей