Anda di halaman 1dari 7

Ministerul Educaiei i Tineretului din Republica Moldova Universitatea de Stat din Moldova

Lucrare de laborator

Tema: Mulimi stabile interior n grafuri neorientate. Algoritmul Bednarek i Taulbee

Student: Andronic Roman


Chiinu 2011

Profesor: L. Novac

Definiii:

Se numete graf neorientat o pereche ordonat de mulimi (X, U), X fiind o mulime finit i nevid de elemente numite noduri sau vrfuri, iar U o mulime de perechi neordonate (submulimi cu dou elemente) din X, numite muchii. Ex.
2 1 5 3 6 +8

Fig.1

Pentru graful de mai sus avem: X={1, 2, 3, 4, 5, 6, 7, 8} U={[1,2], [1,4], [1,5], [2,3], [2,5], [3,4], [6,7]} Dac u1 i u2 sunt dou muchii care au o extremitate comun ele se vor numi adiacente. Submultimea de vrfuri Y a grafului G=(X,U) cu proprietatea c orice 2 vrfuri din Y nu sunt adiacente se numete mulime stabil interior a grafului. Mulimeastabil interior se numete maximal dac ea nu se conine n ntregime ntr-o alt mulime stabil interior a grafului. Mulimea stabil interior se numete maxim dac are cel mai mare cardina dintre toate mulimile stabile interior a grafului. Cardinalul mulimii stabile interior maxime se umete nr. de stabilitate intern a grafului, i se noteaz Exemplu: Fie G(X,U) un graf neorientat: .

Mulimi stabile interior: Y1={x1,x3}; Y2={x2,x4};Y3={x1,x5} Mulime stabil interior maximal: Y2={x2,x4} Mulime stabil interior maxim: Y2={x2,x4} Nr. de stabilitate intern a grafului G: =|Y2|=2

Algoritmul recursive al lui Bednarek i Taulbee


Pentru graful G=(X,U) cu n vrfuri, vom nota prin Xk mulimea primelor k vrfuri, adic Xk={x1,x2,...,xk}. Prin Lk vom nota familia mulimilor stabile interior maximale n subgraful generat de mulimea de vrfuri Xk ,iar prin Yk mulimea tuturor vrfurilor din Xk , neadiacente vrfului xk. (Yk={y Xk : y nu este adiacent vrfului xk}. Folosind notaiile menionate, toate mulimile stabile interior maximale pot fi gsite cu ajutorul urmtorului algoritm: Pasul 1. Fixm X1={x1}, L1= {x1},Y1={x1}. Considerm k=1. Pasul 2. Fixm mulimea Pasul 3. Construim familia de mulimi . Pasul 4. Determinm - familia tuturor mulimilor maximale din .

Pasul 5. Construim familia de mulimi a) dac M , atunci M b) dac M , atunci M se mai consider c { } Pasul 6. Determinm

prin examinarea fiecrui element M din ; i dac n acest caz se respect i condiia M . .

, atunci

-familia tuturor mulimilor maximale din

Pasul 7. Dac k<n-1, atunci considerm k=k+1 i ne ntoarcem la executarea pasului 3. n caz contrar , conine toate mulimile maximale stabile interior n graful G. STOP.

CODUL PROGRAMULUI
#include <conio.h> #include <stdio.h> void inter(int *a, int *b, int *c) // functie cu ajutorul careia se calculeaza intersectia a 2 multimi { int i,j; c[0]=0; for (i=1;i<=a[0];i++) for (j=1;j<=b[0];j++) if (a[i]==b[j]) {c[0]++; c[c[0]]=a[i];} //c[0] reprezinta contorul elementelor pe linia data } void main() { clrscr(); int A[15][15], Nr, i, j, L[15][15], nl, y[15], k, is[15][15], nis, fi[15][15], ni, c[15], t, L_Int[15][15], nls, d[15], e; printf("Dati numarul de varfuri in graf:\n\t\tNr = "); scanf("%i",&Nr); for (i=1;i<=Nr-1;i++) { for (j=i+1;j<=Nr;j++) { printf("A[%i][%i] = ",i,j); scanf("%i",&A[i][j]); A[j][i]=A[i][j]; } A[i][i]=0; } A[Nr][Nr]=0; // Pasul 1 // nl=1; L[nl][0]=1; L[nl][1]=1; for (k=1;k<Nr;k++) { // Pasul 2 // y[0]=0; for (i=1;i<=k+1;i++) if (A[k+1][i]==0) {y[0]++;y[y[0]]=i;} // Pasul 3 //

nis=nl; for (i=1;i<=nl;i++) inter(L[i],y,is[i]); // eliminarea elementelor ce se repeta //

for (i=1; i<nis; i++) for (j=i+1; j<=nis; j++) { inter(is[i],is[j],c); if ((c[0]==is[i][0]) && (c[0]==is[j][0])) { for (e=j+1;e<=nis;e++) for (t=0;t<=is[e][0];t++)

is[e-1][t]=is[e][t]; nis--; } } // Pasul 4 // ni=0; for (i=1;i<=nis;i++) { t=1; for (j=1;j<=nis;j++) { if (i!=j) { inter(is[i],is[j],c); if (c[0]==is[i][0]) {t=0;} } } if (t==1) { ni++; for (j=0;j<=is[i][0];j++) fi[ni][j]=is[i][j]; } } if (ni==0) { ni++; fi[1][0]=0; } // Pasul 5 // nls=0; for (i=1;i<=nl;i++) { inter(L[i],y,c); if (c[0]==L[i][0]) { nls++; for (j=0;j<=L[i][0];j++)

{L_Int[nls][j]=L[i][j];}

L_Int[nls][0]++; L_Int[nls][L_Int[nls][0]]=k+1; } else { nls++; for (j=0;j<=L[i][0];j++) {L_Int[nls][j]=L[i][j];} t=0; for (j=1;j<=ni;j++) { inter(c,fi[j],d); if (c[0]==d[0]) {t=1;} } if (t==1) {nls++; for (j=0;j<=c[0];j++) {L_Int[nls][j]=c[j];} L_Int[nls][0]++; L_Int[nls][L_Int[nls][0]]=k+1; } } } // acolada lui for //

// eliminarea elementelor ce se repeta // for (i=1;i<nls;i++) for (j=i+1;j<=nls;j++) { inter(L_Int[i],L_Int[j],c); if ((c[0]==L_Int[i][0]) && (c[0]==L_Int[j][0])) { for (e=j+1;e<=nls;e++) for (t=0;t<=L_Int[e][0];t++) L_Int[e-1][t]=L_Int[e][t]; nls--; } } // Pasul 6 // nl=0; //contorul pt nr de linii ale matricii L // for (i=1;i<=nls;i++) { t=1; for (j=1;j<=nls;j++) { if (i!=j) { inter(L_Int[i],L_Int[j],c); if (c[0]==L_Int[i][0]) {t=0;} } } if (t==1) // t este flag // { nl++; for (j=0;j<=L_Int[i][0];j++) {L[nl][j]=L_Int[i][j];} } } } // Pasul 7 consta in revenirea la inceput si executarea acelorasi pasi pe rand // printf("\n\nMultimile intern stabile ale grafului sunt:\n\n"); for (i=1;i<=nl;i++) { for (j=1;j<=L[i][0];j++) { printf("%i ",L[i][j]); } printf("\n"); } getch(); }

Rezultatul programului pentru graful :


x3 x1 x2 x4

x5

Problema: De verificat dac e adevrat afirmaia: grafuri neorientate cu 10 vrfuri pentru care irul gradelor vrfurilor sale e rspectiv: 1,1,1,3,3,3,4,6,7,9. Demonstrare: ntr-un graf neorientat un vrf nu poate fi adiacent cu sine nsui. Din acest motiv n grafuri neorientate cu 10 vrfuri pentru care irul de grade a vrfurilor este acesta nu poate exista un vrf al crui grad s fie 7. Deoarece n aa tip de graf vrful de gradul 9 e adiacent cu restu toate vrfurile.De aici rezult c el e adiagent cu vrfurile a cror grad este 1 i de acestea sunt 3 vrfuri.n rezultat obinem 6 vrfuri care pot fi adiacente i ai crui gradul maximal poate fi egal cu 6. Din cele expuse mai sus putem face concluzia c afirmaia dat este fals. Exist