componente conectate într-un grafic

Prezentare generală

În acest tutorial, vom discuta conceptul de componente conectate într-un grafic nedirecționat.

vom trece prin câteva exemple simple pentru a obține o înțelegere de bază și apoi vom enumera proprietățile componentelor conectate.

definiție componentă conectată

o componentă conectată sau pur și simplu o componentă a unui grafic nedirecționat este un subgraf în care fiecare pereche de noduri este conectată între ele printr-o cale.

să încercăm să o simplificăm în continuare. Un set de noduri formează o componentă conectată într-un grafic nedirecționat dacă orice nod din setul de noduri poate ajunge la orice alt nod prin traversarea marginilor. Punctul principal aici este accesibilitatea.

în componentele conectate, toate nodurile sunt întotdeauna accesibile unul de celălalt.

câteva exemple

În această secțiune, vom discuta câteva exemple simple. Vom încerca să corelăm exemplele cu definiția dată mai sus.

3.1. O componentă conectată

în acest exemplu, graficul neorientat dat are o componentă conectată:

să numim acest graficG1(V, E). Aici V = \{V1, V2, V3, V4, V5, V6\} denotă setul de noduri și e = \{E1, E2, E3, E4, E5, E6, E7\} denotă setul de margini al G1. Graficul G1 are o componentă conectată, să o numim C1, care conține toate vârfurile G1. Acum să verificăm dacă setul C1 se menține sau nu la definiție.

conform definiției, nodurile din setulC1 ar trebui să ajungă unul la altul printr-o cale. Alegem două noduri aleatorii V1 și V6:

  • V6 este accesibil pentru V1 prin: E4 \rightarrow E7 \ or\ E3 \rightarrow E5 \rightarrow E7 \ or\ E1 \rightarrow E2 \Rightarrow E6 \rightarrow e7
  • v1 este accesibil la v6 prin: E7 \rightarrow E4 \ sau\ e7 \rightarrow E5 \rightarrow E3 \ sau\ e7 \rightarrow E6\rightarrow E2 \rightarrow E1

vârfurileV1 șiV6 a satisfăcut definiția și am putea face același lucru și cu alte perechi de noduri înC1 de asemenea.

3.2. Mai multe componente conectate

în acest exemplu, graficul neorientat are trei componente conectate:

Let’s name this graph as G2(V, E), where V = \{V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12\}, and E = \{E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11\}. The graph G2 has 3 connected components: C1 = \{V1, V2, V3, V4, V5, V6\}C2 = \{V7, V8, V9\} and C3 = \{V10, V11, V12\}.

acum, să vedem dacă componentele conectateC1C2 șiC3 satisfac definiția sau nu. Vom alege aleatoriu o pereche din fiecareC1C2 șiC3 set.

Din setul C1, să alegem vârfurile V4 și V6.

  • V6 este accesibil la v4 prin: E2 \rightarrow E6 \rightarrow E7 \ or\ E1 \rightarrow E4 \rightarrow E7 \ or\ E1 \rightarrow E3 \rightarrow E5 \rightarrow E7
  • V4 este accesibil pentru V6 via: E7 \Rightarrow E6 \Rightarrow E2 \ sau\ e7 \Rightarrow E4 \Rightarrow E1 \ sau\ E7 \rightarrow E5 \rightarrow E3 \rightarrow E1

acum să alegem vârfurile V8 și V9 din setul C2.

  • V9 is reachable to V8E9 \rightarrow E8
  • V8 is reachable to V9E8 \rightarrow E9

Finally, let’s pick the vertices V11 and V12 from the set C3.

  • V11 is reachable to V12E11 \rightarrow E10
  • V12 este accesibil pentruV11E10 \rightarrow E11

deci, din aceste demonstrații simple, este clar căC1C2 șiC3 urmați definiția componentelor conectate.

Properties

deoarece am discutat deja definiția și am demonstrat câteva exemple ale componentelor conectate, este un moment bun să enumerăm câteva dintre proprietățile importante pe care le deține întotdeauna componenta conectată.

în primul rând, setul de componente conectate este întotdeauna ne-gol.

Mai mult, dacă există mai multe componente conectate pentru un grafic dat, atunci unirea componentelor conectate va da setul tuturor vârfurilor grafului dat.

de exempluG2:

\

în cele din urmă, seturile de componente conectate sunt disjuncte în perechi. Asta înseamnă că dacă luăm intersecția dintre două seturi de componente conectate diferite, atunci intersecția va fi egală cu un set gol sau un set nul.

să luăm în considerare componentele conectate ale graficuluiG2 din nou. În G2, să verificăm această proprietate:

\

găsirea componentelor conectate

având în vedere un grafic nedirecționat, este important să aflați numărul de componente conectate pentru a analiza structura grafului – are multe aplicații din viața reală. Putem folosi fie DFS, fie BFS pentru această sarcină.

în această secțiune, vom discuta despre un algoritm bazat pe DFS care ne oferă numărul de componente conectate pentru un grafic nedirecționat dat:

redat de QuickLaTeX.com

variabila Component_Count returnează numărul de componente conectate în graficul dat.

începem prin inițializarea tuturor nodurilor la steagul care nu a fost vizitat. Apoi alegem orice nod aleatoriu pentru a începe și a verifica dacă am vizitat vertexul sau nu. Dacă nu am făcut-o, numim funcția DFS.

odată ce toate nodurile marcate ca vizitate, algoritmul se termină și imprimă numărul componentelor conectate.

în funcția DFS, argumentele pe care le transmitem sunt un set de noduri care conține toate vârfurile grafului dat și un anumit nod care trebuie să aparțină setului de noduri.

în primul rând, marcăm vertexul de intrare special ca vizitat. Apoi calculăm vârfurile adiacente ale vârfului de intrare dat. Pentru fiecare vârf adiacent, verificăm dacă le-am vizitat sau nu. Dacă nu, atunci numim funcția DFS recursiv până când marcăm toate vârfurile adiacente ca vizitate.

punctul cheie de observat în algoritm este că numărul de componente conectate este egal cu numărul de apeluri funcționale DFS independente. Variabila Component_Count numără numărul de apeluri. Desigur, aceasta nu include apelurile care se fac sub funcția DFS() recursiv.

Test Run

să rulăm algoritmul pe un grafic eșantion:

dat fiind un grafic nedirecționat G3(V, E), unde V = \{V1, V2, V3, V4, V5, V6, V7, V8\} și e = \{E1, E2, E3, E4, E5\}.

primul pas al algoritmului este de a inițializa toate nodurile și de a le marca ca nevizitate.

vârful roșu indică faptul că nu este vizitat. Vertexul verde indică faptul că este vizitat de algoritmul:

putem alege orice nod din lista de noduri pentru a porni algoritmul. Să alegem V1.

algoritmul verifică dacă este vizitat sau nu. În acest caz, V1 nu este vizitat. Deci, se numește DFS(V, V1).

în cadrul DFS(), mai întâi, etichetează vertexul V1 ca vizitat și caută vârfurile adiacente ale V1. Toate nodurile adiacente sunt, de asemenea, marcate ca vizitate. Când DFS termină de vizitat toate vârfurile adiacente ale V1, Component_Count devine 1, iar starea vârfurilor este actualizată:

din nou, algoritmul alege orice nod aleatoriu. Să alegem V4 de data aceasta.

verifică dacăV4 este deja vizitat sau nu. Deoarece nu este vizitat, algoritmul apelează DFS(V, V4). Din nou algoritmul marchează vertexul v4 Marchează ca vizitat, iar DFS caută vârfurile adiacente și le marchează ca vizitate. Acum Component_Count devine 2, iar starea listei de noduri este actualizată din nou:

algoritmul continuă și alegeV6, verifică starea și apeleazăDFS(V, V6). Vertexul V6 și nodurile sale adiacente sunt etichetate ca vizitate și Component_Count crește la 3. Algoritmul actualizează starea listei de noduri:

în cele din urmă, algoritmul alegeV8, apeleazăDFS(V, V8) și faceV8 ca vizitat. VertexulV8 nu are noduri adiacente, astfel încât DFS returnează și Component_Count crește la 4. În cele din urmă, algoritmul actualizează starea listei de noduri:

pe măsură ce algoritmul a terminat traversarea tuturor vârfurilor graficului G3, se termină și returnează valoarea Component_Count care este egal cu numărul de componente conectate în G3div>. În acest caz, algoritmii găsesc patru componente conectate în G3:

am folosit patru culori diferite pentru a ilustra componentele conectate în G3, și anume: C1 = \{V1, V2, V3\}C2 = \{v4, V5\}C3 = \{V6, V7\}C4 = \{V8\}.

analiza complexității timpului

algoritmul pe care tocmai l-am văzut pentru găsirea componentelor conectate într-un grafic nedirecționat dat folosește căutarea DFS și numără numărul de apeluri către funcția DFS. Dacă graficul este reprezentat de lista de adiacență, atunci căutarea DFS vizitează toate vârfurile o dată și fiecare margine de două ori în cazul unui grafic nedirecționat. Verificarea stării nodului iaO(1) timp. Astfel, în total, algoritmul nostru va lua\mathbf{o(V+E)} timp.

în cazul în care graficul este reprezentat de matricea de adiacență, căutarea DFS ia O(v^2) timp în care trebuie să traverseze întregul rând pentru a evalua vârfurile vecine. Verificarea stării nodului durează din nouO(1) timp. Astfel, oferindu-ne un total de \mathbf{o(v^2)} timp.

concluzie

în acest articol, am discutat o definiție simplă a componentei conectate urmată de câteva exemple simple și ușor de înțeles. De asemenea, am enumerat câteva proprietăți comune, dar importante ale componentelor conectate.apoi, am discutat un algoritm bazat pe Căutare DFS pentru a găsi numărul de componente conectate într-un grafic dat. Am demonstrat algoritmul cu ajutorul unui grafic de probă. În cele din urmă, am analizat complexitatea în timp a algoritmului.

Lasă un răspuns

Adresa ta de email nu va fi publicată.