Sunteți pe pagina 1din 39

“COLEGIUL NAŢIONAL GEORGE COŞBUC”

LUCRARE PENTRU ATESTAREA COMPETENŢELOR PROFESIONALE

PROFESOR COORDONATOR:
GIORGESCU EMILIA MIHAELA
ABSOLVENT:
LUPUI IUSTIN MARIAN
CLASA A XII-C

MOTRU-2023
“COLEGIUL NAŢIONAL GEORGE COŞBUC”

LUCRARE PENTRU ATESTAREA COMPETENŢELOR PROFESIONALE


GRAFURI

PROFESOR COORDONATOR:
GIORGESCU EMILIA MIHAELA
ABSOLVENT:
LUPUI IUSTIN MARIAN
CLASA A XII-C

MOTRU-2023
CUPRINS
Ø 1.INTRODUCERE..................................................................pag.4
Ø 2.GRAFURI.............................................................................pag.6
Ø 3.PROGRAME........................................................................pag.23
Ø 4.BIBLIOGRAFIE..................................................................pag.39
INTRODUCERE
Informatica este știința procesării sistematice a informației în special a
procesării cu ajutorul calculatoarelor. Istoric, informatica s-a dezvoltat ca știința
din matematică, în timp ce dezvoltarea primelor calulatoare îsi are originea în
electrotehnica și telecomunicații. De aceea, calculatorul reprezintă doar
dispozitivul pe care sunt implementate conceptele teoretice. Informaticianul
olandez Edsger Dijkstra afirma: 'În Informatica ai de-a face cu calculatorul, cum
ai în astronomie cu telescopul'.
Termenul de 'informatică' provine din alaturarea cuvintelor 'informație' și
'matematică'. Alte surse susțin că provine din combinația informație și
automatică.
Istoria științei calculatoarelor precede momentul apariției computerului
digital.Înainte de anul 1920, termenul de 'computer' se referea ,În limba
engleză,la un o persoană care efectua calcule (un funcționar). Primii cercetători
în ceea ce avea să se numească știința calculatoarelor, cum sunt Kurt Gdel,
Alonzo Church si Alan Turing, au fost interesați de problema computațională:
ce informații ar putea un funcționar uman să calculeze având hartie și creion,
prin urmărirea pur și simplu a unei liste de instrucțiuni, atât timp cât este
necesar, fără să fie nevoie ca el să fie inteligent sau să presupună capacitați
intuitive. Una din motivațiile acestui proiect a fost dorința de a proiecta și
realiza 'mașini computaționale' care să automatizeze munca, deseori plictisitoare
și nu lipsită de erori, a unui computer uman.
În perioada anilor 1940, când mașinile computaționale au cunoscut o evoluție
accelerată, termenul de 'computer' și-a modificat semnificația, referindu-se de
acum mai degrabă la mașini, decât la predecesorii săi umani.
Informatica se divide în următoarele domenii fundamentale:
-informatica teoretică
-informatica practică
-informatica tehnică
Pe lânga cele trei domenii mai exista și 'inteligența artificială’ considerată o
interdisciplină de sine stătătoare.
Informatica teoretică se ocupă cu studiul 'teoriei limbajelor formale', respectiv
automatica, 'teoria computaționala și complexității','criptologie', 'logica','teoria
grafurilor' s.a.m.d punând bazele pentru construirea compilatoarelor pentru
limbajele de programare și pentru formalizarea problemelor din matematică. Ea
este, prin urmare, coloana vertebrală a informaticii.
În matematică și informatică, 'teoria grafurilor' studiază proprietațile grafurilor.
Grafuri
Definiție:
Numim graf o pereche ordonată de mulțimi, notată G=(X,U), unde
X este o mulțime finită si nevidă de elemente numite noduri sau vârfuri,
iar U este o mulțime de perechi (ordonate sau neordonate) de elemente
din X numite muchii (dacă sunt perechi neordonate) sau arce (dacă sunt
perechi ordonate). În primul caz, graful se numește neorientat, altfel
acesta este orientat.
Așadar un graf poate fi reprezentat sub forma unei figuri geometrice
alcătuite din puncte (care corespund vârfurilor) și din linii drepte sau curbe care
unesc aceste puncte (care corespund muchiilor sau arcelor).

Grafurile au o importanta imensă în informatică, de exemplu:


-în unele problemele de sortare si căutare - elementele mulțimii pe care se face
sortarea sau căutarea se pot reprezenta prin noduri într-un graf;
-schema logică a unui program se poate reprezenta printr-un graf orientat în care
o instrucțiune sau un bloc de instrucțiuni este reprezentat printr-un nod, iar
muchiile direcționate reprezintă calea de execuție;
-în programarea orientată pe obiecte, ierarhia obiectelor (claselor) unui program
poate fi reprezentată printr-un graf în care fiecare nod reprezintă o clasă, iar
muchiile reprezintă relații între acestea (derivări, agregări).

Grafuri -Noțiuni Generale

Grafurile se împart în două categorii:


-grafuri neorientate;
Fig. 1 - Graf neorientat
-grafuri orientate;

Fig. 2 - Graf orientat


Grafuri neorientate
Definiție. Se numește graf neorientat o pereche ordonată de mulțimi (X,
U), X fiind o mulțime finită si nevidă de elemente numite noduri sau vârfuri, iar
U o mulțime de perechi neordonate ( submulțimi cu două elemente) din X,
numite muchii.
Ex.
Fig.1
Pentru graful de mai sus avem:
X
U
Dacă u1 si u2 sunt două muchii care au o extremitate comună ele se vor
numi adiacente.
Definiție. Un graf parțial al grafului G=(X,U) este un graf G 1=(X,V)
astfel încat V U, adică G1 are aceeași mulțime de vârfuri ca G iar mulțimea de
muchii V este chiar U sau o submulțime a acesteia.
Ex. Mai jos avem un graf parțial al grafului de mai sus (Fig.1)

Fig.2
Cu alte cuvinte, un graf parțial al unui graf se obține păstrând aceeași
mulțime de vârfuri și eliminând o parte din muchii.
Definiție. Un subgraf al unui graf G=(X,U) este un graf H=(Y,V) astfel
încât Y X iar V conține toate muchiile din U care au ambele extremitați în Y.
Vom spune ca subgraful H este indus sau generat de mulțimea de vârfuri Y.
Ex. Mai jos avem un subgraf al grafului din Fig.1 obținut prin eliminarea
nodului 3

Definiție. Gradul unui vârf x este numărul muchiilor incidente cu x.

Gradul vârfului x se notează cu d(x).


Ex. in Fig.1 d(1)=3, d(4)=2, d(8)=0, d(6)=1
Un vârf care are gradul 0 se numește vârf izolat.
Un vârf care are gradul 1 se numește vârf terminal.
Propoziția 1. Dacă un graf G=(X,U) are m muchii si n vârfuri iar X=,
atunci d(x1)+d(x2)++d(xn)=2m.

Corolar. În orice graf G există un numar par de vârfuri de grad impar.


Definiție. Se numește graf complet cu n varfuri un graf care are
proprietatea că orice două noduri diferite sunt adiacente.
Propoziția 2. Un graf complet Kn are n(n-1)/2 muchii.
Definiție. Un graf G=(X,U) se numește bipartit dacă există două mulțimi
nevide A, B astfel încât X=A U B, A B =F și orice muchie u a lui G are o
extremitate în A iar cealaltă in B.
Definiție. Un graf bipartit se numește complet dacă pentru orice x din A
și orice y din B, există în G muchia [x,y].
GRAFURI ORIENTATE
Un graf orientat G este format dintr-o pereche ordonată de mulțimi
G=(X,U). ca și în cazul grafurilor neorientate, X este mulțimea vârfurilor sau
nodurilor grafului.Mulțimea U este formată din perechi ordonate de elemente
distincte din X, numite arce.Orice arc uI U va fi notat prin u=(x,y) cu x,yIX si x
y.
Spunem ca vârful x este extremitatea inițiala a arcului u, iar vârful y este
extremitatea finală a arcului u. Spre deosebire de cazul grafurilor neorientate,
notațiile(x,y) si (y,x) vor desemna două arce diferite.
Dacă graful G contine arcul (x,y) vom spune ca vârfurile x si y sunt adiacente în
G si amandouă sunt incidente cu arcul (x,y). Deci, un graf orientat G poate fi
imaginat ca o mulțime de vârfuri, dintre care unele sunt unite două câte două
prin arce. Un graf orientat poate fi desenat în plan reprezentând vârfurile sale
prin puncte și arcele prin săgeți care sunt orientate de la extremitatea inițiala
către extremitatea finală a fiecărui arc.
Graful orientat G=(X,U)

Vom nota arcele așa cum se indică în figura , adică u 1=(1,2), u2=(3,1),..,
u11=(6,8).
Gradul exterior al unui vârf x, notat prin d(x), este numărul arcelor de formă
(x,y) cu yIX. Gradul exterior al unui vârf x, notat prin d-(x),este numărul arcelor
de forma (y,x) cu yIX.
Un graf parțial al unui graf orientat G=(X,U) se definește în același mod ca și în
cazul neorientat. El este un graf G1=(X,V) unde V U, deci este graful G însuși
sau se obține din G prin suprimarea anumitor arce.
Și definiția unui subgraf al unui graf orientat G=(X,U) este asemănătoare cu
cazul neorientat.Prin definiție , un subgraf al lui G este un graf H=(Y,V), unde
Y X, iar arcele din V sunt toate arcele din U care au ambele extremitați în
mulțimea de vârfuri Y.
Deci un subgraf H al unui graf orientat G este graful G însuși sau se obține din
G prin suprimarea anumitor vârfuri si a tuturor arcelor incidente cu acestea .
Vom spune ca subgraful H este indus sau generat de mulțimea de vârfuri Y.
Astfel,subgraful grafului G din figura ,indus de mulțimea de vârfuri Y 1 = are ca
mulțime de arce mulțimea V 1 =,iar subgraful indus de mulțimea de vârfuri Y 2 =
are mulțimea arcelor V2=.
Un graf orientat este complet dacă oricare două vârfuri sunt adiacente.
În timp ce in cazul neorientat un graf complet cu n vârfuri este unic determinat,
în cazul orientat există mai multe grafuri complete cu un numar dat de
vârfuri.Ele se deosebesc fie prin orientarea arcelor , fie prin faptul că între două
vârfuri oarecare există un arc sau două arce de sensuri contrare.
Un lanț al unui graf orientat se definește ca un șir de arce:
L=[u1,u2,...,up]
Cu proprietatea că oricare arc uI din acest șir are comună o extremitate cu u i- iar
cealaltă extremitate este comună cu ui+1 pentru orice i=1,,p-1.
Dacă toate arcele lanțului L au aceeași orientare ,care este dată de sensul
deplasării de la x0 către xr lanțul se numește drum.
Deci un drum într-un graf orientat G=(X,U) este un șir de vârfuri notat :
D=(x0,x1,,xr)
cu proprietatea că (x0,x1), (x1,x2), . , (xr-1,xr)IU, deci sunt arce ale grafului.
Vârfurile x0 si xr se numesc extremitațile drumului D. Dacă vârfurile x 0 ,x1 , , xr
sunt distincte două câte două, drumul D se numește elementar. Din aceste
definiții rezultă că orice drum este și lanț , dacă îl privim ca un șir de arce.
Un drum D=(x0, ,xr) poate fi interpretat ca fiind traseul unei deplasări pe arcele
grafului în ordinea (x0,x1), (x1,x2), , (xr-1,xr).
De aceea drumul D de extremitati x0 și xr , se mai spune că este un drum de la x0
la xr .Dacă x0=xr și toate arcele (x0,x1), (x1,x2), ,(xr-1,xr) sunt distincte două câte
două, drumul D se numește circuit.
Daca toate varfurile circuitului, cu exceptia primului si a ultimului varf, sunt
distincte doua cate doua, circuitul se numeste elementar.
Noțiunile de conexitate și de componentă conexă a unui graf orientat sunt
similare cu cele de la grafurile neorientate , utilizând noțiunea de lanț din cazul
grafurilor orientate.
Astfel, un graf orientat G se numește conex dacă pentru oricare două vârfuri
distincte x și y există un lanț de extremități x si y în G. O componentă conexă C
a unui graf orientat G se definește ca fiind un subgraf conex maximal al lui G ,
deci nu existâ nici un lanț care să unească un vârf din C cu un vârf care nu
aparține lui C.
Numim ordinul unui graf, numârul de noduri al grafului, deci cardinalul
mulțimii X(G), și notăm această valoare cu G.

Numărul de muchii se noteaza cu .

Graful vid este graful si se noteaza cu . Spunem ca un graf G


este trivial daca acesta are ordinul 0 sau 1.
Spunem că un nod v este incident cu o muchie r daca . Doua
varfuri x si y se numesc adiacente dacă exista o muchie e care le unește (cu care
amandoua varfurile sunt incidente). Două muchii sunt adiacente daca exista un
nod x care sa fie incident cu ambele muchii.

Numim gradul unui nod particular v , numarul de arce


care sunt conectate la acel nod si se noteaza de obicei cu ρ(v) sau cud(v).
Daca adunam gradele tuturor nodurilor din graful G, obtinem de doua ori
numarul de muchii:

Faptul ca membrul drept al ecuatiei va fi mereu par, implica aceeasi proprietate


in membrul stang, pentru ca egalitatea sa fie satisfacuta.
Spunem ca un graf este conex daca intre oricare doua varfuri ale acestuia
exista cel putin un drum. De exemplu grafurile din figurile 1 si 2 nu sunt
conexe, in timp ce graful din figura 3 este un graf conex. Graful trivial este
considerat conex.

Complementul unui graf G este graful , care contine o


muchie intre varfurile x si y daca si numai daca G nu contine o astfel de muchie.
Complementul unui graf care nu este conex, este un graf conex. Reciproca nu
este adevarata, de exemplu pentru un lant de lungime 3 (intre 4 varfuri).
Tipuri speciale de grafuri
Există si tipuri speciale de grafuri
Acestea sunt:
-graful bipartit:
Fie G=(A,B) neorientat.
G este bipartit dacă exista două mulțimi, A1 si A2 astfel încât A1 ∩ A2 = și A1 U
A2 = A, iar oricare muchie (x,y) aparținând lui B are un capăt în mulțimea A 1 și
celălalt în A2.

Un graf bipartit este bipartit complet daca fiecare nod din multimea A 1 este
adiacent cu toate nodurile din A2 si reciproc.
-graful complet:
Graf complet
Un graf este complet dacă oricare două vârfuri distince sunt adiacente.

Un graf neorientat cu n noduri are n(n-1)/2 muchii.


Există un singur graf complet neorientat cu n noduri.
Există mai multe grafuri orientate complete cu n noduri.
-graful hamiltonian:
Grafuri hamiltoniene
Lanț hamiltonian: lanț elementar care conține toate nodurile grafului.
Ciclu hamiltonian: ciclu elementar care conține toate nodurile grafului.
Graf hamiltonian: graf care conține un ciclu hamiltonian.
Condiții de suficiența:
Teorema lui Dirac: Fie G dat prin perechea (A,B). Dacă G are un număr de cel
puțin 3 varfuri astfel încât gradul fiecarui nod respectă condiția d(x)≥n/2, atunci
graful este hamiltonian.
Algoritmi de determinare a unei soluții
Algoritmul utilizat este Backtracking, care este adaptat in mod corespunzator.
-graful eulerian: Grafuri euleriene
Ciclu eulerian: ciclu care trece prin toate muchiile unui graf exact o data.
Graf eulerian: graf care conține cel puțin un ciclu eulerian.
Da (1,2,3,4,5,3,1)
Condiții de suficiența
Teorema: Fie un graf conex fară noduri izolate cu n≥ 3 noduri. Graful este
eulerian dacă și numai dacă pentru oricare nod al său, x, d(x) este par.
Determinarea unui ciclu eulerian
 Se pornește de la un nod oarecare și se construiește un ciclu.
 Se parcurg nodurile din ciclul determinat anterior; dacă exista un nod care
mai are muchii neincluse în ciclul anterior se construiește un nou ciclu
provenind de la acest nod.
 Ciclul construit este inclus în ciclul inițial în locul nodului găsit la pasul
anterior.
 pas 1:
 c1: 1,2,3,1
 c2: 2,4,7,2
 pas 2:
 c1: 1,2,4,7,2,3,1
 c2: 7,5,10,7
 pas 3:
 c1: 1,2,4,7,5,10,7,2,3,1
 c2: 7,8,11,7
 pas 4:
 c1: 1,2,4,7,8,11,7,5,10,7,2,3,1
 c2: 7,6,9,7
 pas 5:
 c1: 1,2,4,7,6,9,7,8,11,7,5,10,7,2,3,1
-arbori:
Fie G un graf orientat. G este un arbore cu rădacina r, dacă există în G
un vârf r din care oricare alt vârf poate fi ajuns printr-un drum unic.
Definiția este valabilă și pentru cazul unui graf neorientat, alegerea unei
rădacini fiind însă în acest caz arbitrară: orice arbore este un arbore cu radăcina,
iar rădacina poate fi fixata în oricare vârf al său. Aceasta, deoarece dintr-un vârf
oarecare se poate ajunge in oricare alt vârf printr-un drum unic.
Când nu va fi pericol de confuzie, vom folosi termenul "arbore", în loc
de termenul corect "arbore cu rădacina". Cel mai intuitiv este să reprezentăm un
arbore cu rădacina, ca pe un arbore propriu-zis. În Figura 3.1, vom spune că
beta este tatăl lui delta și fiul lui alpha, ca beta si gamma sunt frați, că delta este
un descendent al lui alpha, iar alpha este un ascendent al lui delta. Un vârf
terminal este un vârf fără descendenți. Vârfurile care nu sunt terminale sunt
neterminale. De multe ori, vom considera ca exista o ordonare a descendentilor
aceluiasi parinte: beta este situat la stanga lui gamma, adica beta este fratele mai
varstnic al lui gamma.
Orice vârf al unui arbore cu rădacina este rădacina unui subarbore
constând din vârful respectiv și toți descendenții săi. O mulțime de arbori
disjuncți formează o pădure.
Într-un arbore cu rădacina vom adopta următoarele notații. Adâncimea
unui vârf este lungimea drumului dintre rădacina și acest vârf; înalțimea unui
vârf este lungimea celui mai lung drum dintre acest vârf și un vârf terminal;
înalțimea arborelui este înalțimea rădăcinii; nivelul unui vârf este înalțimea
arborelui, minus adâncimea acestui vârf.
Reprezentarea unui arbore cu rădăcina se poate face prin adrese, ca și în
cazul listelor înlanțuite. Fiecare vârf va fi memorat în trei locații diferite,
reprezentând informația propriu-zisa a vârfului (valoarea varfului), adresa celui
mai vârstnic fiu și adresa urmatorului frate. Păstrând analogia cu listele
înlăntuite, dacă se cunoaște de la început numărul maxim de vârfuri, atunci
implementarea arborilor cu rădăcina se poate face prin tablouri paralele
Au fost studiate diferite tipuri de arbori binari, adică arbori pentru care
e-gradul fiecarui nod este mai mic sau egal cu 2. Arborii care au e-gradul mai
mare sau egal cu 2 se numesc arbori multicai.
Dacă se dorește să se prezinte descendenta unei persoane din punct de
vedere al stramoșilor, i se asociază persoanei doi părinți, obținându-se un arbore
binar.
Se consideră problema construirii si explorarii informației conținute în arbori de
mari dimensiuni; se consideră și operațiile executate unor astfel de arbori.
Să notam că astfel de arbori sunt păstrați pe suporturi auxiliare; atunci
nodurile arborelui sunt memorate pe un suport auxiliar și sunt transferate pe
rând sau pe grupe in memoria centrală.
Structurile dinamice sunt cele utilizate eficient pentru implementarea
unor astfel de arbori. În acest caz pointerii nodurilor nu vor mai indica adrese de
memorie.
Utilizând un arbore cu 106 noduri, vor fi necesare aproximativ log2106
pași pentru căutarea unor elemente.
Deoarece fiecare pas necesită un acces la memoria auxiliara rezultă
necesitatea unei organizari care să reducă numarul de accese.
Este știut faptul că după realizarea accesului la un anumit element al
memoriei auxiliare este ușor accesibil fiecare element al arborelui din zona
respectivă. Acest lucru sugerează că un arbore poate fi divizat in subarbori ce
pot fi reprezentați ca unități la care accesul se realizează deodată. Subarborii în
care sunt divizați arborii de mari dimensiuni și care au proprietatea de mai sus
se numesc pagini.
Pentru descompunerea în pagini a unui arbore binar trebuie avute în
vedere urmatoarele aspecte:
a) modul de grupare a cheilor într-un arbore multicai;
b) modul de plasare a elementelor corespunzatoare diverselor chei;
c) tehnica de inserare sau eliminare a unei chei;
d) modul de aranjare a cheilor în cadrul unui nod.
Dintre toate modurile de organizare a arborilor multicai cel mai eficient
este arborele 3-2, care reprezinta o variantă de arbore echilibrat; un nod al unui
astfel de arbore poate avea cel mult 3 descendenți direcți.

1.Matricea de adiacentă

A. Pentru grafuri neorientate


 a[i,j] = 1, dacă între i si j este muchie
 a[i,j] = 0 altfel.
Observație: Pe diagonala principală toate elementele sunt 0 (nu avem bucle).
Matricea este simetrică față de diagonala principală, deci: a[i,j] = a[j,i].
B. Pentru grafuri orientate
 a[i,j] = 1, dacă exista arcul (i,j);
 a[i,j] = 0, altfel.

2. Liste de adiacență
Pentru fiecare nod se memorează o listă a vecinilor săi.
Pentru întregul graf este necesar un vector de liste (P) in care Pi este adresa
primului element al listei asociate lui i.
De exemplu, pentru i = 1, informația din lista figurată mai sus se va completa
astfel: p[1] - 2 - 3 - 5.

Observație: pentru grafurile orientate se memorează în lista lui i nodurile k


pentru care există arcul (i,k).

4. Matricea noduri-arce

Este folosită în special pentru grafurile orientate.


Matricea noduri-arce aferenta
Este folosită în special pentru grafurile orientate

5.Matricea noduri-arce aferentă

Observație: matricea noduri-arce poate fi adaptată și pentru grafurile


neorientate
EXERCIȚII

1.Se dă un graf neorientat cu n (n<=100) vârfuri si m muchii prin lista


muchiilor. Afisați toate subgrafurile pe care le are. Fiecare subgraf va fi afișat
astfel:
- vârfurile lui
- matricea de adiacență
Exemplu:
graf.in
3 2
1 2
1 3
graf.out
Varfurile subgrafului: 1
Matricea de adiacenta:
0 0 0
0 0 0
0 0 0
Varfurile subgrafului: 1 2
Matricea de adiacenta:
0 1 0
1 0 0
0 0 0
Varfurile subgrafului: 1 2 3
Matricea de adiacenta:
0 1 1
1 0 0
1 0 0
Varfurile subgrafului: 1 3
Matricea de adiacenta:
0 0 1
0 0 0
1 0 0
Varfurile subgrafului: 2
Matricea de adiacenta:
0 0 0
0 0 0
0 0 0
Varfurile subgrafului: 2 3
Matricea de adiacenta:
0 0 0
0 0 0
0 0 0
Varfurile subgrafului: 3
Matricea de adiacenta:
0 0 0
0 0 0
000
#include <fstream>
using namespace std;
ifstream fin("graf.in");
ofstream
fout("graf.out");

int n,m,A[101]
[101],X[101];

void afisare(int k)
{
fout<<"Varfurile
subgrafului: ";
for(int i=1;i<=k;i++)
fout<<X[i]<<" ";
fout<<endl;
fout<<"Matricea de
adiacenta:\n";
int P[101]={0};
for(int i=1;i<=k;i++)
P[X[i]]=1;
for(int i=1;i<=n;i++)
{
for(int
j=1;j<=n;j++)
if(P[i] &&
P[j]) fout<<A[i][j]<<" ";
else fout<<"0
";
fout<<endl;
}
}

void back(int k)
{
for(int i=X[k-
1]+1;i<=n;i++)
{
X[k]=i;
afisare(k);
back(k+1);
}
}

int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
A[x][y]=A[y]
[x]=1;
}
back(1);
return 0;
}

2.Se dau două grafuri neorientate G1 și G2 cu n (n<=100) vârfuri și m1,


respectiv m2 muchii prin listele muchiilor, în două fișiere graf1.in, respectiv
graf2.in. Verificați dacă unul dintre ele este graf parțial al celuilalt. Se va
preciza dacă G1 este graf parțial al lui G2, dacă G2 este graf parțial al lui G1
sau NU dacă niciunul dintre ele este graf parțial al celuilalt.
Exemplu:
graf1.in
5 2
1 4
1 3
graf2.in
5 5
1 4
1 3
3 5
4 5
2 5
graf.out
G1 este graf partial al lui G2

#include <fstream>
using namespace std;
ifstream fin1("graf1.in");
ifstream fin2("graf2.in");
ofstream fout("graf.out");

int n,m1,m2,A[101]
[101],B[101][101],x,y;

int graf_partial(int n, int A[]


[101], int B[][101])
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(B[i][j]==1 && A[i]
[j]==0) return 0;
return 1;
}

int main()
{
fin1>>n>>m1;
for(int i=1;i<=m1;i++)
{
fin1>>x>>y;
A[x][y]=A[y][x]=1;
}
fin2>>n>>m2;
for(int i=1;i<=m2;i++)
{
fin2>>x>>y;
B[x][y]=B[y][x]=1;
}
if(m1>m2)
if(graf_partial(n,A,B))
fout<<"G2 este graf partial al
lui G1";
else fout<<"NU";
else
if(graf_partial(n,B,A))
fout<<"G1 este graf partial al
lui G2";
else fout<<"NU";
return 0;
}

3.Se dă un graf neorientat cu n (n<=100) vârfuri si m muchii prin


lista muchiilor. Afisați toate grafurile parțiale pe care le are.
Fiecare graf parțial va fi afișat astfel:
- numărul lui de ordine (al câtelea a fost generat)
- lista munchiilor lui
- matricea de adiacență
Exemplu:
graf.in
4 2
1 4
1 3
graf.out
Graful partial numarul 1:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
Graful partial numarul 2:
1 4
0 0 0 1
0 0 0 0
0 0 0 0
1 0 0 0
Graful partial numarul 3:
1 4
1 3
0 0 1 1
0 0 0 0
1 0 0 0
1 0 0 0
Graful partial numarul 4:
1 3
0 0 1 0
0 0 0 0
1 0 0 0
0000

#include <fstream>
using namespace
std;
ifstream
fin("graf.in");
ofstream
fout("graf.out");

struct muchie { int


i,j; };
int
n,m,X[5001],nrsol;
muchie M[5001];

void afisare(int k)
{
nrsol++;
fout<<"Graful
partial numarul
"<<nrsol<<":\n";
for(int
i=1;i<=k;i++)
fout<<M[X[i]
].i<<"
"<<M[X[i]].j<<"\
n";
int A[101]
[101]={0};
for(int
i=1;i<=k;i++)
A[M[X[i]].i]
[M[X[i]].j]=A[M[
X[i]].j]
[M[X[i]].i]=1;
for(int
i=1;i<=n;i++)
{
for(int
j=1;j<=n;j++)
fout<<A[i]
[j]<<" ";
fout<<"\n";
}
}

void back(int k)
{
for(int i=X[k-
1]+1;i<=m;i++)
{
X[k]=i;
afisare(k);
back(k+1);
}
}
int main()
{
fin>>n>>m;
for(int
i=1;i<=m;i++)
fin>>M[i].i>>
M[i].j;
afisare(0);
back(1);
return 0;
}

4.Din fisierul graf.in se citesc de pe prima linie numerele naturale n si l


(l,n<=20) reprezentand numarul de varfuri ale unui graf complet si respectiv
lungimea unui ciclu.
Afisati in fisierul graf.out, in ordine lexicografica, toate ciclurile elementare de
lungime l ale grafului complet cu n varfuri.
Exemplu:
graf.in
5 3
graf.out
1 2 3 1
1 2 4 1
1 2 5 1
1 3 2 1
1 3 4 1
1 3 5 1
1 4 2 1
...
5435
#include <fstream>
using namespace std;
ifstream fin("graf.in");
ofstream
fout("graf.out");

int n,X[21],P[21],l;

void afisare()
{
for(int i=1;i<=l;i++)
fout<<X[i]<<" ";
fout<<X[1]<<endl;
}

void back(int k)
{
for(int i=1;i<=n;i++)
if(!P[i])
{
X[k]=i;
P[i]=1;
if(k==l)
afisare();
else back(k+1);
P[i]=0;
}
}

int main()
{
fin>>n>>l;
back(1);
return 0;

5.Se sa un graf neorientat cu n varfuri si m muchii, fara varfuri izolate.


Sa se determine daca este eulerian si in caz afirmativ sa se afiseze un ciclu
eulerian.
Pentru determinarea ciclului eulerian nu se va folosi metoda backtracking.
date.in:
6 10
1 2
1 6
2 3
2 5
2 6
3 4
3 5
3 6
4 5
5 6
date.out:
este eulerian
12356254361

#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream
fout("date.out");
int n,m,A[100]
[100],P[100],k,G[100];

void citire()
{
int x,y;
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>x>>y;
A[x][y]=A[y]
[x]=1;
}
}

int grad(int
k)//calculeaza gradul
varfului k
{
int s=0;
for(int i=1;i<=n;i++)
if(A[k][i]==1) s++;
return s;
}

void DF(int s)//parcurge


graful din varful s si
marcheaza varfurile
accesibile
{
P[s]=1;
for(int i=1;i<=n;i++)
if(A[s][i]==1 &&
P[i]==0)
DF(i);
}

int conex()//conexitatea
grafului
{
DF(1);
for(int i=1;i<=n;i++)
if(P[i]==0) return
0;
return 1;
}

int euler()//daca este


eulerian
{
if(!conex()) return
0;//conex
for(int i=1;i<=n;i++)
if(G[i]%2==1)
return 0;//si toate
gradele pare
return 1;
}

void ciclu_eulerian(int
k)//construieste un ciclu
eulerian
{
int maxx=0,nmax=0;
fout<<k<<" "; //afiseaza
varful curent
for(int i=1;i<=n;i+
+)//cauta varful urmator
cu grad maxim
{
if(A[k][i]==1)
if(G[i]>maxx)
{
maxx=grad(i);
nmax=i;
}
}
if(nmax!=0)
{ A[k]
[nmax]=A[nmax]
[k]=0;//sterge mughia
G[k]--;//scade
gradele
G[nmax]--;
ciclu_eulerian(n
max);//merge in varful
urmator
}
}

int main()
{
citire();
for(int i=1;i<=n;i++)
G[i]=grad(i);
if(euler())
{
fout<<"este
eulerian\n";
ciclu_eulerian(1);
}
else fout<<"nu este
eulerian\n";

fin.close();
fout.close();
return 0;
}

6.Se da un graf neorientat conex cu n varfuri si m muchii. Eliminati un numar


minim de muchii din graf astfel incat acesta sa nu mai contina nici un ciclu.
Se vor afisa muchiile eliminate si matricea de adiacenta a grafului partial
obtinut astfel.
Exemplu:
date.in
4 6
1 2
1 3
1 4
2 3
2 4
3 4
date.out
[2,3]
[2,4]
[3,4]
0111
1000
1000
1000
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream
fout("date.out");
int A[50][50],n,m;
int x[50],p[50];
void sterg(int s)
{
int st,dr,i,x[50];

st=dr=1;
p[s]=1;
x[1]=s;
while(st<=dr)
{
for(i=1; i<=n; i++)
if(A[x[st]]
[i]==1)
if(!p[i])
{
dr++;
x[dr]=i;
p[i]=1;
A[i]
[x[st]]=0;
}
else
{
fout<<"["<<
x[st]<<","<<i<<"]"<<en
dl;
A[x[st]]
[i]=A[i][x[st]]=0;
}
st++;
}
}

int main()
{
int x,y,i,j;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
A[x][y]=A[y]
[x]=1;
}
sterg(1);
for(i=1;i<=n;i++)
for(j=1;j<i;j++)
A[i][j]=A[j][i];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
fout<<A[i][j];
fout<<endl;
}
fin.close();
fout.close();
return 0;
}
BIBLIOGRAFIE
1. Thomas H. Cormen, Charles E. Leiserson, Ronald L., Introducere in
Algoritmi – Capitolul 23 Algoritmi elementari pe grafuri
2. D.R. Popescu, Combinatorica si teoria grafurilor, SSMR, 2005
3. Tomescu, Combinatorica si teoria grafurilor, Tipografia Univ. Bucuresti,
1978
4. Andone R., Garbacea I., Algoritmi fundamentali o perspectivă C++, Editura
Libris, Cluj- Napoca, 1995
5. Atanasiu A., Concursuri de informatică: Probleme propuse, Editura Petrion,
Bucureşti, 1994
6. Cucoș C., Pedagogie (Editia a II-a, revazută și adaugită), Editura Polirom,
Iaşi, 2006
7. Masalagiu C., Asiminoaei I., Didactica predării informaticii, Editura
Polirom, Iaşi, 2004
8. Mateescu G. D., Moraru P. F., Informatica pentru liceu şi bacalaureat –
materia de clasa a XI-a, Colecţia Donaris, Sibiu, 2001
9. Miloșescu M., Manual pentru clasa a XI-a informatică intensiv, Editura
Didactică și Pedagogică, Bucureşti, 2006
10. Munteanu F., Ionescu T., Muscă Gh., Programarea calculatoarelor, Editura
Didactică şi Pedagogică, Bucureşti, 1992.
11. Odăgescu I., Furtună F., Metode şi tehnici de programare, Editura
Computer Libris Agora, Cluj Napoca, 1998
12. Tomescu I., Bazele informaticii, manual pentru clasa a X, Editura Didactică
şi Pedagogică, Bucureşti, 1994
13. Tomescu, Ioan, Probleme de combinatorica si teoria grafurilor, Editura
Didactica si Pedagogica, Bucuresti, 1981.
14. Paul Van Dooren, , Belgium, Graph Theory and Applications, Université
catholique de Louvain Louvain-la-Neuve
15. Tudor S., Huţanu V., Informatică, manual clasa a XI-a, informatică
intensiv, Editura L&S Soft, Bucureşti, 2006
16. http://www.infoarena.ro
17. https://sites.google.com/site/teoriagrafurilor/
18. http://www.graf.go.ro/files/tipuri.htm
19. http://campion.edu.ro/arhiva/
20. http://en.wikipedia.org/wiki/Graph_theory
21. http://www.ginfo.ro/revista/15_3/focus1.pdf

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