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 grafic. Aici denotă setul de noduri și denotă setul de margini al . Graficul are o componentă conectată, să o numim , care conține toate vârfurile . Acum să verificăm dacă setul se menține sau nu la definiție.
conform definiției, nodurile din setul ar trebui să ajungă unul la altul printr-o cale. Alegem două noduri aleatorii și :
- este accesibil pentru prin:
- este accesibil la prin:
vârfurile și a satisfăcut definiția și am putea face același lucru și cu alte perechi de noduri în de asemenea.
3.2. Mai multe componente conectate
în acest exemplu, graficul neorientat are trei componente conectate:
Let’s name this graph as , where , and . The graph has 3 connected components: and .
acum, să vedem dacă componentele conectate și satisfac definiția sau nu. Vom alege aleatoriu o pereche din fiecare și set.
Din setul , să alegem vârfurile și .
- este accesibil la prin:
- este accesibil pentru via:
acum să alegem vârfurile și din setul .
- is reachable to
- is reachable to
Finally, let’s pick the vertices and from the set .
- is reachable to
- este accesibil pentru
deci, din aceste demonstrații simple, este clar că și 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 exemplu:
î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 graficului din nou. În , 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:
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 , unde și .
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 .
algoritmul verifică dacă este vizitat sau nu. În acest caz, nu este vizitat. Deci, se numește .
în cadrul DFS(), mai întâi, etichetează vertexul ca vizitat și caută vârfurile adiacente ale . Toate nodurile adiacente sunt, de asemenea, marcate ca vizitate. Când DFS termină de vizitat toate vârfurile adiacente ale , Component_Count devine 1, iar starea vârfurilor este actualizată:
din nou, algoritmul alege orice nod aleatoriu. Să alegem de data aceasta.
verifică dacă este deja vizitat sau nu. Deoarece nu este vizitat, algoritmul apelează . Din nou algoritmul marchează vertexul 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 alege, verifică starea și apelează. Vertexul ș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 alege, apelează și face ca vizitat. Vertexul 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 , se termină și returnează valoarea Component_Count care este egal cu numărul de componente conectate în div>. În acest caz, algoritmii găsesc patru componente conectate în :
am folosit patru culori diferite pentru a ilustra componentele conectate în , și anume: .
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 ia timp. Astfel, în total, algoritmul nostru va lua timp.
în cazul în care graficul este reprezentat de matricea de adiacență, căutarea DFS ia timp în care trebuie să traverseze întregul rând pentru a evalua vârfurile vecine. Verificarea stării nodului durează din nou timp. Astfel, oferindu-ne un total de 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.