ASD Ćwiczenia 12: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Diks (dyskusja | edycje)
m Zastępowanie tekstu – „ </math>” na „</math>”
 
(Nie pokazano 10 wersji utworzonych przez 3 użytkowników)
Linia 1: Linia 1:
==Zadanie 1==
==Zadanie 1==
Pokaż, w jaki sposób sprawdzić w czasie liniowym, czy graf jest grafem dwudzielnym
Pokaż, w jaki sposób sprawdzić w czasie liniowym, czy graf jest grafem dwudzielnym:
 


<div class="mw-collapsible mw-made=collapsible mw-collapsed">


a) z pomocą przeszukiwania wszerz,
a) za pomocą przeszukiwania wszerz,


b) z wykorzystaniem przeszukiwania w głąb.
b) z wykorzystaniem przeszukiwania w głąb.


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Wskazówka  
Wskazówka  


<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
Skorzystaj z faktu, że graf jest grafem dwudzielnym wtedy i tylko wtedy, gdy nie zawiera żadnego cyklu o długości nieparzystej. Przeanalizuj te miejsca w obu algorytmach, w których wykrywany jest cykl.
Skorzystaj z faktu, że graf jest grafem dwudzielnym wtedy i tylko wtedy, gdy nie zawiera żadnego cyklu o długości nieparzystej. Przeanalizuj te miejsca w obu algorytmach, w których wykrywany jest cykl.
</div>
</div>
==Zadanie 2==
Niech <math>G=(V,E)</math> będzie grafem spójnym. '''Wierzchołkiem rozdzielającym''' w grafie <math>G</math> nazywamy każdy wierzchołek, którego usunięcie rozspójnia <math>G</math>. Zaadaptuj algorytm wykrywania mostów grafie do znajdowania wszystkich wierzchołków rozdzielających.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Wskazówka
<div class="mw-collapsible-content" style="display:none">
Udowodnij następujące twierdzenie.
----
Niech <math>T</math> będzie drzewem przeszukiwania w głąb grafu <math>G</math>. Wierzchołek <math>v</math> jest wierzchołkiem rozdzielającym w grafie <math>G</math> wtedy i tylko wtedy, gdy <math>v</math> jest korzeniem <math>T</math> i ma w <math>T</math> dwóch synów lub <math>v</math> nie jest korzeniem, ale posiada syna <math>u</math> takiego, że <math>nr[v] \le low[u]</math>.
</div>
</div>
==Zadanie 3==
Graf spójny bez wierzchołków rozdzielających nazywamy '''grafem dwuspójnym'''. Dwuspójną składową grafu G nazywam każdy jego maksymalny (w sensie zawierania) dwuspójny podgraf.
----
a) Udowodnij, że każda krawędź grafu należy do dokładnie jednej dwuspójnej składowej.
----
b) Zaprojektuj algorytm, który w czasie liniowym policzy wszystkie dwuspójne składowe danego (przez listy sąsiedztw), spójnego grafu, tzn. podzieli zbiór wszystkich krawędzi na podzbiory odpowiadające poszczególnym dwuspójnym składowym.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Wskazówka
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
Zaadaptuj algorytm do wykrywania wierzchołków rozdzielających. Każdą nowo odwiedzaną krawędź <math>u-v</math> odkładaj na stos. Bez straty ogólności przyjmijmy, że <math>u</math> jest przodkiem <math>v</math> w drzewie. Jeśli <math>u-v</math> jest krawędzią drzewową, to odkładamy ją na stos będąc w wierzchołku <math>u</math>, natomiast jeśli jest to krawędź niedrzewowa, to będąc w wierzchołku <math>v</math>. Po wykryciu każdego wierzchołka rozdzielającego <math>v</math> wypisz wszystkie krawędzie ze stosu kończąc na krawędzi drzewowej <math>v-u</math> takiej, że <math>low[u] \ge nr[v]</math>.
</div>
</div>
</div>
==Zadanie 4==
Dotychczas rozważaliśmy tylko grafy nieskierowane. Zaproponuj sposób reprezentacji grafu skierowanego za pomocą list sąsiedztw.
==Zadanie 5==
Powiemy, że graf skierowany jest '''silnie spójny''', jeśli dla każdej pary wierzchołków <math>u</math>, <math>v</math> istnieją skierowane ścieżki z <math>u</math> do <math>v</math> i z <math>v</math> do <math>u</math>. Zaprojektuj algorytm, który w czasie <math>O(n+m)</math> sprawdza, czy dany graf jest grafem silnie spójnym.
==Zadanie 6==
Zaproponuj algorytm, który w czasie liniowym zorientuje krawędzie grafu dwuspójnego w taki sposób, żeby otrzymany graf był silnie spójny.

Aktualna wersja na dzień 10:05, 5 wrz 2023

Zadanie 1

Pokaż, w jaki sposób sprawdzić w czasie liniowym, czy graf jest grafem dwudzielnym:


a) za pomocą przeszukiwania wszerz,

b) z wykorzystaniem przeszukiwania w głąb.


Wskazówka

Zadanie 2

Niech G=(V,E) będzie grafem spójnym. Wierzchołkiem rozdzielającym w grafie G nazywamy każdy wierzchołek, którego usunięcie rozspójnia G. Zaadaptuj algorytm wykrywania mostów grafie do znajdowania wszystkich wierzchołków rozdzielających.

Wskazówka

Zadanie 3

Graf spójny bez wierzchołków rozdzielających nazywamy grafem dwuspójnym. Dwuspójną składową grafu G nazywam każdy jego maksymalny (w sensie zawierania) dwuspójny podgraf.


a) Udowodnij, że każda krawędź grafu należy do dokładnie jednej dwuspójnej składowej.


b) Zaprojektuj algorytm, który w czasie liniowym policzy wszystkie dwuspójne składowe danego (przez listy sąsiedztw), spójnego grafu, tzn. podzieli zbiór wszystkich krawędzi na podzbiory odpowiadające poszczególnym dwuspójnym składowym.

Wskazówka

Zadanie 4

Dotychczas rozważaliśmy tylko grafy nieskierowane. Zaproponuj sposób reprezentacji grafu skierowanego za pomocą list sąsiedztw.

Zadanie 5

Powiemy, że graf skierowany jest silnie spójny, jeśli dla każdej pary wierzchołków u, v istnieją skierowane ścieżki z u do v i z v do u. Zaprojektuj algorytm, który w czasie O(n+m) sprawdza, czy dany graf jest grafem silnie spójnym.

Zadanie 6

Zaproponuj algorytm, który w czasie liniowym zorientuje krawędzie grafu dwuspójnego w taki sposób, żeby otrzymany graf był silnie spójny.