Pe scurt
Un graf poate fi păstrat ca listă de muchii, matrice de adiacență sau liste de adiacență. Pentru graful neorientat cu muchiile și , lista de vecini a lui 2 este . În matrice, pozițiile , , și sunt marcate.
În detaliu
Un graf cu vârfuri și muchii (sau arce) poate fi memorat în trei moduri uzuale. Matricea de adiacență are elemente și a[i][j]=1 dacă există muchia sau arcul de la la . Listele de adiacență păstrează, pentru fiecare vârf, lista vecinilor lui. Lista muchiilor (sau a arcelor) păstrează perechile de extremități. Alegerea depinde de operația frecventă și de cât de multe muchii are graful.
Exemplul 1 — matricea de adiacență. Pentru muchiile și :
#include <iostream>
using namespace std;
int main() {
int a[4][4] = {};
a[1][2] = a[2][1] = 1;
a[2][3] = a[3][2] = 1;
cout << a[1][3] << " " << a[2][3];
}
Se afișează 0 1: nu există muchie directă 1–3, dar există 2–3. Matricea folosește spațiu proporțional cu și testează o muchie direct, în timp constant. Listele de vecini folosesc spațiu proporțional cu , fiind convenabile pentru grafuri rare, adică cu puține muchii. Dacă a[1][3]=0, lipsește muchia , dar există lanțul 1–2–3.
Exemplul 2 — de la matrice la celelalte reprezentări. Graful neorientat are 4 vârfuri și muchiile , , . Programul pornește de la matrice, extrage lista muchiilor (numai perechile , ca fiecare muchie să apară o singură dată) și listele de adiacență:
#include <iostream>
using namespace std;
int main() {
int n = 4, a[5][5] = {};
a[1][2] = a[2][1] = a[2][3] = a[3][2] = a[2][4] = a[4][2] = 1;
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
if (a[i][j]) cout << i << " " << j << "\n";
for (int i = 1; i <= n; ++i) {
cout << i << ":";
for (int j = 1; j <= n; ++j)
if (a[i][j]) cout << " " << j;
cout << "\n";
}
}
Se afișează lista muchiilor 1 2, 2 3, 2 4, apoi listele 1: 2, 2: 1 3 4, 3: 2 și 4: 2. Lista muchiilor păstrează fiecare muchie o singură dată într-un graf neorientat, dar căutarea tuturor vecinilor unui vârf cere parcurgerea întregii liste, dacă nu există un index separat. În listele de adiacență, fiecare muchie apare în două liste, deci în total sunt elemente. Pentru un graf orientat, lista conține arce, iar sensul fiecăruia contează: arcul apare în lista lui 1, nu și în a lui 2.
Alegerea reprezentării. Dacă programul întreabă des „există muchia ?”, matricea răspunde în , iar listele cer parcurgerea listei lui . Dacă programul parcurge vecinii unui vârf, cum fac parcurgerile în lățime și în adâncime, listele examinează numai vecinii existenți, adică în total, în timp ce matricea examinează o linie întreagă pentru fiecare vârf, adică . Pentru un graf rar cu și , o parcurgere pe matrice verifică un milion de celule, iar pe liste cel mult elemente. Pentru un graf aproape complet, diferența dispare, iar matricea este mai simplă.
Exemplul 3 — graf orientat. Un graf orientat cu 3 vârfuri are arcele , , și . Matricea de adiacență nu este simetrică: liniile sunt 011, 001 și 100. Sumele liniilor sunt 2, 1 și 1, adică gradele externe ale vârfurilor (numărul arcelor care pleacă din vârf). Sumele coloanelor sunt 1, 1 și 2, adică gradele interne (numărul arcelor care intră). Ambele însumează 4, numărul arcelor, iar listele de adiacență sunt 1: 2 3, 2: 3 și 3: 1.
int n = 3, m = 4, a[4][4] = {};
int arce[4][2] = {{1, 2}, {2, 3}, {3, 1}, {1, 3}};
for (int k = 0; k < m; ++k)
a[arce[k][0]][arce[k][1]] = 1;
for (int i = 1; i <= n; ++i) {
int ext = 0, in = 0;
for (int j = 1; j <= n; ++j) {
ext += a[i][j];
in += a[j][i];
}
cout << ext << in << ' ';
}
Programul afișează 21 11 12 , adică perechile (grad extern, grad intern) ale vârfurilor 1, 2 și 3. Pentru un graf orientat fiecare arc se marchează o singură dată în matrice, deci diferă de cazul neorientat, în care marcarea se face în ambele celule simetrice.
Pentru admitere
Într-un graf neorientat simplu, matricea este simetrică și diagonala este zero. Suma valorilor ei este , nu , fiindcă fiecare muchie apare în două celule. Suma elementelor de pe linia este gradul vârfului . Într-un graf orientat, doar celula corespunzătoare sensului arcului este marcată, iar suma tuturor elementelor este , numărul arcelor. Pentru graful neorientat, lungimea totală a listelor de adiacență este tot , iar lista muchiilor are perechi. Matricea ocupă celule indiferent de ; pentru și ea are un milion de celule, față de elemente în listele de adiacență. Dacă un enunț dă matricea, gradele se citesc din sumele liniilor; dacă dă listele, din lungimile lor.
Exemplu în formatul examenului. Un graf neorientat simplu are matricea de adiacență cu suma tuturor elementelor egală cu 14. Câte muchii are graful?
- a) 7
- b) 14
- c) 28
- d) 49
Răspunsul corect este a). Fiecare muchie marchează două celule, a[i][j] și a[j][i], deci suma elementelor este și . Varianta b) confundă suma cu numărul muchiilor, iar varianta c) dublează suma în loc să o înjumătățească. Varianta d) este , fără legătură cu datele. Același graf are 14 elemente în listele de adiacență, adică suma gradelor, și 7 perechi în lista muchiilor.
Greșeli frecvente
- Greșit: marcarea lui
a[1][2]este suficientă pentru o matrice de graf neorientat.Corect: marchează șia[2][1]. - Greșit: suma matricei este numărul muchiilor neorientate.Corect: este dublul lui pentru graf simplu.
- Greșit: matricea arată un drum 1–3 dacă
a[1][3]=0.Corect: acea celulă arată doar adiacența directă.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI intensiv; rocnee.eu
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI; plan de încadrare: OMEC 7723/2024, anexa 2, tabelele 1–25, legislatie.just.ro; filiera tehnologică: OMEC 7724/2024, anexa 4, tabelul calificării, legislatie.just.ro
- UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
Documente consultate
- UNSTPB, admitere 2026, anexa XI-3, p. Anx XI-6–7
- Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE, p. 4–5; rocnee.eu
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 5–6; edu.ro
- Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro
Desene: Redactare proprie (desen original)
