Didaxis
lecție · Informatică

Matricea drumurilor

Existența drumurilor între perechi de vârfuri.

Se face în:
Clasa a XI-a
Actualizat la: 30 octombrie 2026
1pe scurtstratul 1 din 2 · rezumatul lecției

Pe scurt

Matricea drumurilor arată dacă se poate ajunge de la un vârf la altul printr-un drum, nu doar printr-un arc direct. Pentru arcele 1→2 și 2→3, există drum 1→3, chiar dacă nu există arcul direct 1→3. Poziția corespunzătoare perechii este astfel adevărată în matricea drumurilor.

Desen la lecția „Matricea drumurilor”
2în detaliustratul 2 din 2 · pentru clasă și Bacalaureat

În detaliu

Matricea drumurilor (închiderea tranzitivă) are drum[i][j]=1 dacă în graful orientat există cel puțin un drum de lungime cel puțin 1 de la la , și 0 în caz contrar. Spre deosebire de matricea de adiacență, ea cuprinde accesibilitatea prin mai multe arce. Algoritmul Roy–Warshall pornește de la matricea de adiacență. Pentru fiecare vârf intermediar , de la 1 la , se parcurg toate perechile : dacă există drum de la la și de la la , se marchează un drum de la la . Ciclul după trebuie să fie cel exterior. Cele trei cicluri dau timpul și memoria ; lucrează numai cu 0 și 1, deci nu are nevoie de costuri.

Exemplul 1 — un graf fără circuite. Arcele sunt și :

#include <iostream>
using namespace std;
int main() {
    const int n = 3;
    int drum[4][4] = {{0}, {0, 0, 1, 0}, {0, 0, 0, 1}, {0, 0, 0, 0}};
    for (int k = 1; k <= n; ++k)
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                if (drum[i][k] && drum[k][j]) drum[i][j] = 1;
    cout << drum[1][3];
}

Se afișează 1: la k=2, există drum[1][2] și drum[2][3], deci drum[1][3] devine 1, prin vârful 2. Diagonala nu se completează automat: drum[i][i]=1 numai dacă există un circuit care trece prin i. În acest exemplu, fără circuite, diagonala rămâne zero.

Exemplul 2 — un graf cu circuit. Graful are 4 vârfuri și arcele , , , . Programul calculează matricea drumurilor, o afișează și numără valorile 1:

#include <iostream>
using namespace std;
int main() {
    const int n = 4;
    int d[5][5] = {};
    d[1][2] = d[2][3] = d[3][1] = d[3][4] = 1;
    for (int k = 1; k <= n; ++k)
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                if (d[i][k] && d[k][j]) d[i][j] = 1;
    int total = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            cout << d[i][j] << " ";
            total += d[i][j];
        }
        cout << "\n";
    }
    cout << total;
}

Se afișează liniile 1 1 1 1, 1 1 1 1, 1 1 1 1 și 0 0 0 0, apoi 12. Vârfurile 1, 2 și 3 se află pe circuitul , deci fiecare ajunge la toate cele trei, inclusiv la el însuși (diagonala este 1), și la 4, prin arcul . Din 4 nu pleacă niciun arc, deci linia 4 este zero. Două vârfuri și sunt în aceeași componentă tare conexă dacă drum[i][j] și drum[j][i] sunt 1: aici 1, 2 și 3 formează o componentă, iar 4 este singur.

Exemplul 2 bis — de ce k este ciclul exterior. Fie graful cu arcele , și . Cu ordinea corectă (k, apoi i, apoi j) toate cele nouă elemente ale matricei devin 1, pentru că fiecare vârf ajunge la toate, inclusiv la el însuși, prin circuit. Dacă ciclul după k se pune în interior (ordinea i, j, k), pentru i = 1 și j = 1 se verifică drum[1][k] && drum[k][1] când drumul încă nu este înregistrat: drum[2][1] este 0 și drum[1][3] tot. Elementul drum[1][1] rămâne 0, deși există circuit. Ordinea greșită pierde drumuri care trec prin vârfuri intermediare descoperite mai târziu.

Exemplul 3 — în formatul examenului. Pentru graful orientat din al doilea exemplu, câte elemente egale cu 1 are matricea drumurilor?

  • a) 4
  • b) 9
  • c) 12
  • d) 16

Răspunsul corect este c). Vârfurile 1, 2 și 3 ajung fiecare la toate cele patru vârfuri, deci elemente egale cu 1; vârful 4 nu ajunge nicăieri. Varianta a) este numărul arcelor, adică elementele matricei de adiacență. Varianta b) numără numai perechile din interiorul circuitului și uită că 3 ajunge la 4 și, prin 3, ajung și 1 și 2. Varianta d) ar însemna că și 4 ajunge la toate vârfurile.

Greșeli frecvente

  • Greșit: matricea drumurilor este identică cu matricea de adiacență.
    Corect: include și accesibilitatea prin mai multe arce.
  • Greșit: dacă nu există arcul direct 1→3, vârful 1 nu poate ajunge la 3.
    Corect: există drumul 1→2→3, deci în matricea drumurilor poziția este 1.
  • Greșit: dacă 1 ajunge la 3, și 3 ajunge la 1.
    Corect: sensul arcelor contează.
în contul tăuPremium

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

Documente consultate

  • Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE, p. 4–5; rocnee.eu
  • University of Rochester, „Graphs: Transitive Closure”, cs.rochester.edu/u/nelson/courses/csc_173/graphs/tc.html

Desene: Redactare proprie (desen original), conform OMECI 5099/2009, Informatică XI; rocnee.eu

lecțiile sunt gratuite

Ai citit lecția. Acum verifică-te.