Sunteți pe pagina 1din 10

Ministerul Educaiei i Tineretului din Republica Moldova

Universitatea de Stat din Moldova

Lucrare de laborator

Tema: Mulimi stabile n grafuri neorientate.

Algoritmul Malgrange

Student:
Student:
Profesor: Novac L.

Chiinu 2009
I. Noiuni preliminare:
Fie M o matrice binar, finit, de dimensiune mn, cu mulimea de linii L={l 1,l2,,lm} i
mulimea de coloane C={c1,c2,,cm}. Vom nota =(A,B) matricea format din elementele de la
intersecia liniilor AI i a coloanelor BJ.
Fie acum 1 i 2 dou submatrice ale matricei M, determinate de perechile de mulimi de linii
i coloane (Ai,Bi) i=1,2 (1=(A1,B1) i 2=(A2,B2)).
Dac A1A2 , B1B2 (12), matricea 1 se numete submatrice a matricei 2 .
Dac toate elementele din sunt egale cu 1, submatricea a matricei M se numete
complet.
Dac submatricea este complet i n M nu exist o alt submatrice complet astfel nct
, se numete principal.
Dac orice element egal cu 1 din M aparine cel puin unei submatrici din familia C={1,2,
,p}, aceast familie C se numete acoperire a matricei C.
Cardinalul mulimii stabile interior maxime a grafului G se noteaz prin 0(G) i se numete
numr de stabilitate intern.

II. Descrierea algoritmului


Fie A matricea de adiacen a unui graf neorientat G=(X;U):

a b c d e f

a 0 1 0 1 1 1

b 1 0 1 1 1 1

c 0 1 0 1 0 0

d 1 1 1 0 1 1

e 1 1 0 1 0 1

f 1 1 0 1 1 0

iar este matricea complementar a acesteia (elementele ij ale matricei se calculeaz n baza
elementelor aij ale matricei A dupa formula ij=1- aij):

a b c d e f

2
a 1 0 1 0 0 0

b 0 0 0 0 0 0

c 1 0 1 0 1 1

d 0 0 0 1 0 0

e 0 0 1 0 1 0

f 0 0 1 0 0 1

1
Scopul lucrrii: De a construi toate submatricile principale ptratice ale lui , n baza crora
se pot determina toate mulimile maximale stabile interior ale ale grafului G, prin utilizarea
algoritmului Malgrange.

Pasul 1. Construim o acoperire arbitrar C0 a matricei . n calitate de acoperirea C0 se ia


familia tuturor submatricelor complete din de forma i=(Ai,Bi), unde |A|=1, iar Bi este format
din coloanele matricei , ce conin unitatea n linia Ai.

Acoperirea iniial C0 a matricei este:

C0 = { (a,ac), (b,b), (c,acef), (d,d), (e,ce), (f,cf) }.

Pasul 2. Pentru p=0, construim familia Xp={iCp, ji astfel, nct j i } familia tuturor
submatricelor complete din Cp, care care se conin n alte submatrice ale lui Cp.

n acest caz X0=

Pasul 3. Construim familia de submatrice (Cp\Xp), care se obine prin aplicarea operaiilor
i asupra tuturor perechilor posibile de matrice i, j din Cp\Xp, cu condiia ca aceste
elemente noi s nu le conin pe submatricele din Cp\Xp.

C0\X0= C0(C0\X0) = (C0):

(a, ac) (c,acef) = (a c, ac acef) = (ac,ac)


(a, ac) (e,ce) = (a e, ac ce) = (ae,c)
(a, ac) (f,cf) = (a f, ac cf) = (af,c)
(c, acef) (e,ce) = (c e, acef ce) = (ce,ce)
(c, acef) (f,cf) = (c f, acef cf) = (cf,cf)
(e,ce) (f,cf) = (e f, ce cf) = (ef,c)

(C0\X0) ={ (ac,ac), (ae,c), (af,c), (ce,ce), (cf,cf), (ef,c) }.

Pasul 4. Formm acoperirea de matrice: Cp+1Cp\Xp) ((Cp\Xp))

3
C1C0\X0) ((C0\X0)) = { (a,ac), (b,b), (c,acef), (d,d), (e,ce), (f,cf), (ac,ac), (ae,c), (af,c), (ce,ce),
(cf,cf), (ef,c) }.

Pasul 5. Dac Cp+1 Cp, atunci considerm p=p+1 i ne rentoarcem la Pasul 2.


C1 0

Pasul 2. Construim familia Xp+1=X1:


2
(a,ac) (ac,ac)
(e,ce) (ce,ce)
(f,cf) (cf,cf)

X1 ={ (a,ac), (e,ce), (f,cf) }.

Pasul 3. Construim familia (Cp+1\Xp+1) = (C1\X1):

C1\X1= { (b,b), (c,acef), (d,d), (f,cf), (ac,ac), (ae,c), (af,c), (ce,ce), (ef,c) }.

(c,acef) (f,cf) = (c f, acef cf) = (cf,cf)

(c,acef) (ac,ac) = (c ac, acef ac) = (ac,ac)

(c,acef) (ae,c) = (c ae, acef c) = (ace,c)

(c,acef) (af,c) = (c af, acef c) = (acf,c)

(c,acef) (ce,ce) = (c ce, acef ce) = (ce,ce)

(c,acef) (ef,c) = (c ef, acef c) = (cef,c)

(f,cf) (ac,ac) = (f ac, cf ac) = (acf,c)

(f,cf) (af,c) = (f af, cf c) = (af,c)

(f,cf) (ce,ce) = (f ce, cf ce) = (cef,c)

(f,cf) (ef,c) = (f ef, cf c) = (ef,c)

(ac,ac) (ce,ce) = (ac ce, ac ce) = (ace,c)

(ae,c) (af,c) = (ae af, c c) = (aef,c)

(ae,c) (ce,ce) = (ae ce, c ce) = (ace,c)

(ae,c) (ef,c) = (ae ef, c c) = (aef,c)

4
(af,c) (ce,ce) = (af ce, c ce) = (acef,c)

(af,c) (ef,c) = (af ef, c c) = (aef,c)

(ce,ce) (ef,c) = (ce ef, ce c) = (cef,c)

(C1\X1) = { (cf,cf), (ac,ac), (ace,c), (acf,c), (ce,ce), (cef,c), (af,c), (ef,c), (aef,c), (acef,c) }

Pasul 4.
C2C1\X1) ((C1\X1)) = { (b,b), (c,acef), (d,d), (f,cf), (ac,ac), (ae,c), (af,c), (ce,ce), (ef,c), (cf,cf),
(ace,c), (acf,c), (cef,c), (aef,c), (acef,c) }

Pasul 5. C2 1

Pasul 2. Construim familia Xp+1=X2:

(f,cf) (cf,cf)
(ae,c) (ace,c), (aef,c) i (acef,c)
(af,c) (acf,c), (aef,c) i (acef,c)
(ef,c) (cef,c) i (acef,c)
3
(ace,c) (acef,c)
(acf,c) (acef,c)
(cef,c) (acef,c)
(aef,c) (acef,c)
X2 = {(f,cf), (ae,c), (af,c), (ef,c), (ace,c), (acf,c), (cef,c), (aef,c)}

Pasul 3. Construim familia (Cp+1\Xp+1) = (C2\X2):

C2\X2= { (b,b), (c,acef), (d,d), (ac,ac), (ce,ce), (cf,cf), (acef,c)}

(c,acef ) (ac,ac) = (c ac, acef ac) = (ac,ac)


(c,acef ) (ce,ce) = (c ce, acef ce) = (ce,ce)
(c,acef) (cf,cf) = (c cf, acef cf) = (cf,cf)
(c,acef ) (acef,c) = (c acef, acef c) = (acef,c)
(ac,ac) (ce,ce) = (ac ce, ac ce) = (ace,c)
(ac,ac) (cf,cf) = (ac cf, ac cf) = (acf,c)
(ac,ac) (acef,c) = (ac acef, ac c) = (acef,c)
(ce,ce) (cf,cf) = (ce cf, ce cf) = (cef,c)
(ce,ce) (acef,c) = (ce acef, ce c) = (acef,c)
(cf,cf) (acef,c) = (cf acef, cf c) = (acef,c)

(C2\X2) = { (ac,ac), (ce,ce), (cf,cf), (acef,c), (ace,c), (acf,c), (cef,c) }

Pasul 4.
C3C2\X2) ((C2\X2)) = { (b,b), (c,acef), (d,d), (ac,ac), (ce,ce), (cf,cf), (acef,c), (ace,c), (acf,c),
(cef,c) }

5
Pasul 5. C3 2

Pasul 2. Construim familia Xp+1=X3:

(ace,c) (acef c)
(acf,c) (acef,c)
(cef,c) (acef,c)

X3 ={ (ace,c), (acf,c), (cef,c) }

Pasul 3. Construim familia (Cp+1\Xp+1) = (C3\X3):

C3\X3 ={ (b,b), (c,acef), (d,d), (ac,ac), (ce,ce), (cf,cf), (acef,c) }


(C3\X3) = { (ac,ac), (ce,ce), (cf,cf), (acef,c), (ace,c), (acf,c), (cef,c) }

4
Pasul 4.
C4C3\X3) ((C3\X3)) = C3

Pasul 5. C4 = 3 , rezult c C3 conine toate submatricele principale ale matricei .

Pasul 6.Construim o familie nou F n care includem submatricele ptraticemaximale ale


submatricelor principale din C3, respectnd condiia ca fiecare dintre acestea s nu le conin
alt submatrice ptratic din F.

C3 { (b,b), (c,acef), (d,d), (ac,ac), (ce,ce), (cf,cf), (acef,c), (ace,c), (acf,c), (cef,c) }

F = { (b,b), (d,d), (ac,ac), (ce,ce), (cf,cf) }

Vrfurile ce corespund liniilor (coloanelor) matricelor familiei F formeaz o mulime stabil


interior. Astfel, numrul tuturor mulimilor stabil interior este egal cu |F| (|F|=5).

S = { {b}, {d}, {a, c}, {c, e}, {c, f} } (S-familia tuturor mulimilor stabile interior a grafului G).

Mulimile stabile interior maxim sunt {a, c}, {c, e} i {c, f}.

Prin urmare 0(G) = 2.


Programul
#include <string.h>
#include <stdio.h>
#include <conio.h>

struct multsime{
struct submultime{
char A[10],B[10];
}sm[100];
}C[2],X[1];
char nit[10],nru[10];

unsigned cmp(char *, char );

6
unsigned c2(char *, char*);
void it(char* , char*);
void ru(char* , char*);
void sort(char *);
void del(unsigned , unsigned);
unsigned check(char *,char *,unsigned n);
unsigned eql(unsigned ,unsigned );

int main(){
//clrscr();
multsime S;
unsigned i, j, n, com[10][10]; //com - complementara
char *std="ABCDEFGH", lit[2]={'\0'};
int b[6][6]={
0,1,0,1,1,1,//1
1,0,1,1,1,1,//2
0,1,0,1,0,0,//3
1,1,1,0,1,1,//4
1,1,0,1,0,1,//5
1,1,0,1,1,0};//6
n=6;

/* printf("introdu nr de virfuri:");
scanf("%i", &v);
printf("introdu matricea de adiacenta:");
for(i=0; i<v; i++)
for(j=0; j<v; j++){
printf("\n b[%c][%c]=",std[i],std[j]);
scanf("%i", &b[i][j]);
}*/
printf("complementara:\n");
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
com[i][j]=1-b[i][j];
printf( " %i ",com[i][j]);}
printf("\n");
}

for(i=0; i<n; i++) { // transformarea in litere


lit[0]=*(std+i);lit[1]='\0';
strcat(C[0].sm[i].A,lit);
for(j=0; j<n; j++)
if(com[i][j]==1) {
lit[0]=*(std+j); lit[1]='\0';
strcat(C[0].sm[i].B,lit);}
}
unsigned m=0,k=0,v=n,l;

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

do{

C[1]=C[0];
m=n;
n=v;

//afisharea C0 submultsimelor A,B Pasul 2


printf("Afisharea lui C/ Pasul 2\n");
for (i=0;i<m;i++)
printf("C(%s|%s)\n", C[1].sm[i].A, C[1].sm[i].B);

//submultsimele din C[]

for (i=0;i<m;i++)
for (j=0;j<m;j++)
if ((i!=j) && (c2(C[0].sm[i].A, C[0].sm[j].A)) && (c2(C[0].sm[i].B, C[0].sm[j].B))){
strcpy(X[0].sm[k].A,C[0].sm[j].A);
strcpy(X[0].sm[k].B,C[0].sm[j].B);
k++;
}
//afisharea X[]
printf("\nafisham multsimea X\n");
for (i=0;i<k;i++){

7
if (strlen(X[0].sm[i].A))
printf("X(%s|%s)\n", X[0].sm[i].A, X[0].sm[i].B);}
getch();

//(C[]/X[])

for(i=0;i<n;i++)
for(j=0;j<k+1;j++)
if( !strcmp(C[0].sm[i].A, X[0].sm[j].A) && !strcmp(C[0].sm[i].B, X[0].sm[j].B))
{del(i,n);n--;}

//C[] reuniunea shi intersectia cautarea in C[] it shi ru


printf("\nPasul 3\n");

for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
ru(C[0].sm[i].A, C[0].sm[j].A);
it(C[0].sm[i].B, C[0].sm[j].B);

printf("(%s,%s)U(%s,%s)=(%s,%s)\n",C[0].sm[i].A,C[0].sm[i].B,C[0].sm[j].A,C[0].sm[j].B,nru,strlen(nit)>0?nit:"Vid");
if (strlen(nit) && strlen(nru) && check(nru,nit,v)){
strcpy(C[0].sm[v].A, nru);
strcpy(C[0].sm[v].B, nit);
v++;
}
}
getch();
puts("C[0]");
for (l=0;l<m;l++) if(strlen(C[1].sm[l].A)) printf("\t%.2d.C[1](%s|%s)\n",l, C[1].sm[l].A, C[1].sm[l].B);
puts("C[1]");
for (l=0;l<v;l++) if(strlen(C[0].sm[l].A)) printf("\t%.2d.C[0](%s|%s)\n",l, C[0].sm[l].A, C[0].sm[l].B);

getch();
n=v;
printf("X=%d",k);
printf("\nCiclu\n\n");

}while(eql(m,n)); printf("\ndone!\n");
//------------------------------------------------------------------
char vt[10][10];
puts("Rezultat:");
printf("F=");
for (l=0;l<v;l++)
if ((strcmp(C[0].sm[l].A,C[0].sm[l].B)==0) && (strlen(C[0].sm[l].B)))
printf("(%s|%s);",C[0].sm[l].A, C[0].sm[l].B);
printf("\nS={");
for (l=0;l<v;l++)
if ((strcmp(C[0].sm[l].A,C[0].sm[l].B)==0) && (strlen(C[0].sm[l].B))){
printf("{");
for (i=0;i<strlen(C[0].sm[l].A);i++) printf("%s%c",i?",":"",C[0].sm[l].A[i]);
printf("}");
}
printf("}");

getch();
return 1;
}
//controleaza da ca intrun shie se contsine caracterul variabila
unsigned cmp(char *p,char c){ //return 0 dace este return 1 daca nui
unsigned i=0;
while (*(p+i))
if(*(p+i++)==c) return 0;
return 1;
};

unsigned c2(char *a, char *b){


if ((strlen(a)>=strlen(b))){
while (*b)
if (cmp(a,*(b)++)) return 0;
return 1;}
return 0;
}

8
//intersectsia a 2 shiruri
void it(char *a,char *b){
char inter[10]={'\0'};
unsigned i=0;
if(strlen(a) && strlen(b))
while (*(b+i))
if(!cmp(a,*(b+i++))) *(inter+strlen(inter))=*(b+i-1);
sort(inter);
strcpy(nit,inter);
}
//reunuinea a 2 shiruri
void ru(char* a, char* b){
int i=0;
strcpy(nru,a);
char lit[2]={'\0'};
while (*(b+i))
if ( cmp(nru,b[i++]) ) {lit[0]=*(b+i-1); strcat(nru,lit);}

sort(nru);
}

//sortarea crescator a shirului (metoda bulelor)


void sort(char *p){
char tmp;
unsigned i,j,x=strlen(p);
for(i=1; i<x; i++)
for(j=0; j<x-i; j++)
if (p[j] > p[j+1] ) {tmp=p[j]; p[j]=p[j+1]; p[j+1]=tmp;}
}

//shtergerea din C[]


void del(unsigned i,unsigned n){
for (;i<n;i++){
C[0].sm[i]=C[0].sm[i+1];
}
}

//daca In C[] nu se contsine a shi b return 1


unsigned check(char *a,char *b,unsigned n){
for(int i=0;i<n;i++)
if( strcmp(C[0].sm[i].A,a)==0 )
if(strcmp(C[0].sm[i].B,b)==0) { return 0;}
return 1;
}

unsigned eql(unsigned n,unsigned m){


unsigned egale,j,i;
if (n!=m) return 1;
for(i=0;i<n;i++){
egale=0;
for(j=0;j<m;j++)
if((strcmp(C[0].sm[i].A,C[1].sm[j].A)==0) || (strcmp(C[0].sm[i].B,C[1].sm[j].B)==0)){
egale=1;break;}
}
if(egale) return 0; else return 1;
}

Rezultatul
complementara: 0 0 0 1 0 0 C(A|AC)
1 0 1 0 0 0 0 0 1 0 1 0 C(B|B)
0 1 0 0 0 0 0 0 1 0 0 1 C(C|ACEF)
1 0 1 0 1 1 Afisharea lui C/ Pasul 2 C(D|D)

9
C(E|CE) (B,B)U(AF,C)=(ABF,Vid) C(AE|C)
C(F|CF) (B,B)U(CE,CE)=(BCE,Vid) C(AF|C)
(B,B)U(CF,CF)=(BCF,Vid) C(CE|CE)
afisham multsimea X (B,B)U(EF,C)=(BEF,Vid) C(CF|CF)
(C,ACEF)U(D,D)=(CD,Vid) C(EF|C)
Pasul 3 (C,ACEF)U(AC,AC)=(AC,AC) C(|)
(A,AC)U(B,B)=(AB,Vid) (C,ACEF)U(AE,C)=(ACE,C) C(|)
(A,AC)U(C,ACEF)=(AC,AC) (C,ACEF)U(AF,C)=(ACF,C) C(|)
(A,AC)U(D,D)=(AD,Vid) (C,ACEF)U(CE,CE)=(CE,CE) C(ACE|C)
(A,AC)U(E,CE)=(AE,C) (C,ACEF)U(CF,CF)=(CF,CF) C(ACF|C)
(A,AC)U(F,CF)=(AF,C) (C,ACEF)U(EF,C)=(CEF,C) C(CEF|C)
(B,B)U(C,ACEF)=(BC,Vid) (D,D)U(AC,AC)=(ACD,Vid) C(ACEF|C)
(B,B)U(D,D)=(BD,Vid) (D,D)U(AE,C)=(ADE,Vid) C(AEF|C)
(B,B)U(E,CE)=(BE,Vid) (D,D)U(AF,C)=(ADF,Vid)
(B,B)U(F,CF)=(BF,Vid) (D,D)U(CE,CE)=(CDE,Vid) afisham multsimea X
(C,ACEF)U(D,D)=(CD,Vid) (D,D)U(CF,CF)=(CDF,Vid) X(A|AC)
(C,ACEF)U(E,CE)=(CE,CE) (D,D)U(EF,C)=(DEF,Vid) X(E|CE)
(C,ACEF)U(F,CF)=(CF,CF) (AC,AC)U(AE,C)=(ACE,C) X(F|CF)
(D,D)U(E,CE)=(DE,Vid) (AC,AC)U(AF,C)=(ACF,C) X(AE|C)
(D,D)U(F,CF)=(DF,Vid) (AC,AC)U(CE,CE)=(ACE,C) X(AF|C)
(E,CE)U(F,CF)=(EF,C) (AC,AC)U(CF,CF)=(ACF,C) X(EF|C)
C[0] (AC,AC)U(EF,C)=(ACEF,C) X(AE|C)
00.C[1](A|AC) (AE,C)U(AF,C)=(AEF,C) X(AF|C)
01.C[1](B|B) (AE,C)U(CE,CE)=(ACE,C) X(EF|C)
02.C[1](C|ACEF) (AE,C)U(CF,CF)=(ACEF,C) X(ACE|C)
03.C[1](D|D) (AE,C)U(EF,C)=(AEF,C) X(ACF|C)
04.C[1](E|CE) (AF,C)U(CE,CE)=(ACEF,C) X(CEF|C)
05.C[1](F|CF) (AF,C)U(CF,CF)=(ACF,C) X(AEF|C)
C[1] (AF,C)U(EF,C)=(AEF,C) X(AE|C)
00.C[0](A|AC) (CE,CE)U(CF,CF)=(CEF,C) X(AF|C)
01.C[0](B|B) (CE,CE)U(EF,C)=(CEF,C) X(EF|C)
02.C[0](C|ACEF) (CF,CF)U(EF,C)=(CEF,C)
03.C[0](D|D) C[0] Pasul 3
04.C[0](E|CE) 00.C[1](A|AC) (B,B)U(C,ACEF)=(BC,Vid)
05.C[0](F|CF) 01.C[1](B|B) (B,B)U(D,D)=(BD,Vid)
06.C[0](AC|AC) 02.C[1](C|ACEF) (C,ACEF)U(D,D)=(CD,Vid)
07.C[0](AE|C) 03.C[1](D|D) C[0]
08.C[0](AF|C) 04.C[1](E|CE) 00.C[1](B|B)
09.C[0](CE|CE) 05.C[1](F|CF) 01.C[1](C|ACEF)
10.C[0](CF|CF) 06.C[1](AC|AC) 02.C[1](D|D)
11.C[0](EF|C) 07.C[1](AE|C) 03.C[1](AC|AC)
X=0 08.C[1](AF|C) 04.C[1](AE|C)
Ciclu 09.C[1](CE|CE) 05.C[1](AF|C)
10.C[1](CF|CF) 06.C[1](CE|CE)
Afisharea lui C/ Pasul 2 11.C[1](EF|C) 07.C[1](CF|CF)
C(A|AC) C[1] 08.C[1](EF|C)
C(B|B) 00.C[0](B|B) 12.C[1](ACE|C)
C(C|ACEF) 01.C[0](C|ACEF) 13.C[1](ACF|C)
C(D|D) 02.C[0](D|D) 14.C[1](CEF|C)
C(E|CE) 03.C[0](AC|AC) 15.C[1](ACEF|C)
C(F|CF) 04.C[0](AE|C) 16.C[1](AEF|C)
C(AC|AC) 05.C[0](AF|C) C[1]
C(AE|C) 06.C[0](CE|CE) 00.C[0](B|B)
C(AF|C) 07.C[0](CF|CF) 01.C[0](C|ACEF)
C(CE|CE) 08.C[0](EF|C) 02.C[0](D|D)
C(CF|CF) 12.C[0](ACE|C) 03.C[0](AC|AC)
C(EF|C) 13.C[0](ACF|C) 04.C[0](CE|CE)
14.C[0](CEF|C) 05.C[0](CF|CF)
afisham multsimea X 15.C[0](ACEF|C) 06.C[0](ACEF|C)
X(A|AC) 16.C[0](AEF|C) X=64
X(E|CE) X=3 Ciclu
X(F|CF) Ciclu

Pasul 3 Afisharea lui C/ Pasul 2 done!


(B,B)U(C,ACEF)=(BC,Vid) C(B|B) Rezultat:
(B,B)U(D,D)=(BD,Vid) C(C|ACEF) F=(B|B);(D|D);(AC|AC);(CE|CE);(CF|CF);
(B,B)U(AC,AC)=(ABC,Vid) C(D|D) S={{B}{D}{A,C}{C,E}{C,F}}
(B,B)U(AE,C)=(ABE,Vid) C(AC|AC)

10

S-ar putea să vă placă și