Пусть нам даны два непересекающихся множества A и B одинакового размера n. Нужно найти множество из n пар (a,b), таких, что a принадлежит A, b принадлежит B и они удовлетворяют некоторым условиям. Для выбора таких пар существует много различных критериев; Один из них называется правилом стабильных браков. Предположим, что A – множество мужчин, а B – женщин. У каждого мужчины и женщины есть различные правила предпочтения возможного партнера. Если среди n выбранных пар существуют мужчины и женщины, не состоящие между собой в браке, но предпочитающие друг друга, а не своих фактических супругов, то такое множество браков считается нестабильным.
Проблема в том, что дин. массив rwm при вызове try() теряет последнюю строчку. куда она девается??
Код:
//---------------------------------------------------------------------------
#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 n;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->StringGrid1->Cells[0][0]="w/r";
Form1->StringGrid2->Cells[0][0]="m/r";
StringGrid1->Options << goEditing;
StringGrid2->Options << goEditing;
}
int w,m,r;
int **wmr=new int *[n+1];
int **mwr=new int *[n+1];
int **rmw=new int *[n+1];
int **rwm=new int *[n+1];
int * x= new int[n+1];
int *y= new int[n+1];
int *man= new int[n+1];
int *wooman= new int[n+1];
int *rank= new int[n+1] ;
boolean *single = new boolean[n+1];
boolean stable(int m,int w,int r){
int pm,pw,i,lim;
boolean s=true;
i=1;
while((i<r)&&s)
{
pw=wmr[m][i];i++;
if (!single[pw]) s=(rwm[pw][m]>rwm[pw][y[pw]]);
}
i=1;
lim=rwm[w][m];
while((i<lim)&&s)//????
{
pm=mwr[w][i];i++;
if((pm<m)){s=(rmw[pm][w]>rmw[pm][x[pm]]); }
}
return s;
}
void Try(int m)
{
int w=0;r=0;
for(int r=1;r<=n;r++) {
w=wmr[m][r];
if (single[w])
{
x[m] = w;
y[w] = m;
single[w] = false;
if (m< n)Try(m+1);
else{
for(int i=1;i<=n;i++)
Form1->Memo1->Lines->Add(IntToStr(y[i])+" : "+IntToStr(x[i]));
};
single[w]= true;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Clear();
n=StrToInt(Edit1->Text);
StringGrid1->RowCount=n+1;
StringGrid1->ColCount=n+1;
StringGrid2->RowCount=n+1;
StringGrid2->ColCount=n+1;
for (int i=1;i<=n;i++)
{
StringGrid1->Cells[0][i]=i;
StringGrid1->Cells[i][0]=i;
StringGrid2->Cells[0][i]=i;
StringGrid2->Cells[i][0]=i;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
StringGrid1->Cells[j][i]="";
for(int i=1;i<=n;i++)
for(int k=1;k<=n;k++)
{
a:
int j=random(n)+1;
if(StringGrid1->Cells[j][i]=="")
{
StringGrid1->Cells[j][i]=k;
}else goto a;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
StringGrid2->Cells[j][i]="";
for(int i=1;i<=n;i++)
for(int k=1;k<=n;k++)
{
b:
int j=random(n)+1;
if(StringGrid2->Cells[j][i]=="")
{
StringGrid2->Cells[j][i]=k;
}else goto b;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo1->Lines->Clear();
for(int q=1;q<=n;q++)
{
wmr[q]=new int[n+1];
mwr[q]=new int[n+1];
rwm[q]=new int[n+1];
rmw[q]=new int[n+1];
}
for(int w=1;w<=n;w++)
{
single[w]=true;
for(int r=1;r<=n;r++)
{
mwr[w][r]=StrToInt(StringGrid2->Cells[r][w]);
rwm[w][mwr[w][r]]=r;
}
}
for(int m=1;m<=n;m++){
for(int r=1;r<=n;r++)
{
wmr[m][r]=StrToInt(StringGrid1->Cells[r][m]);
rmw[m][wmr[m][r]]=r;
}
}
Try(1);
}
//---------------------------------------------------------------------------