public List <int> ZnajdzDrogeRozszerzajaca(int zbior1, int zbior2) { Drzewo <int> d; GrafNDzielny g = new GrafNDzielny(this); //g.UsunKrawedzieWychodzaceZeZbioru(zbior2); Drzewo <int> .Wierzcholek <int> w = null; foreach (int v1 in WierzcholkiZbioru(zbior1)) { if (g.Skojarzenie(v1).HasValue) { continue; } d = new Drzewo <int>(); d.DodajKorzen(v1); w = g.SzukajNieskojarzonego(d.korzen, zbior2); if (w != null) { break; } } if (w != null) { return(w.SciezkaDoKorzenia()); } else { return(null); } }
public bool SciezkaZawieraWierzcholek(Drzewo <T> .Wierzcholek <T> w) { if (w.Equals(this)) { return(true); } if (rodzic == null) { return(false); } return(rodzic.SciezkaZawieraWierzcholek(w)); }
private Drzewo <int> .Wierzcholek <int> SzukajNieskojarzonego(Drzewo <int> .Wierzcholek <int> wierzcholekStartowy, int wZbiorze) { Drzewo <int> .Wierzcholek <int> result = null; foreach (int w in Sasiedzi(wierzcholekStartowy.Wartosc)) { if (wierzcholekStartowy.SciezkaZawieraElement(w) == false) { wierzcholekStartowy.DodajDziecko(w); } } foreach (var d in wierzcholekStartowy.Dzieci) { if (Skojarzenie(d.Wartosc).HasValue == false && NalezyDoZbioru(d.Wartosc, wZbiorze)) { result = d; break; } else { // Szukanie dalej po scieżce naprzemiennej skojarzony-nieskojarzony // Sprawdzanie czy ścieżka jest naprzemienna na podstawie 3 węzłów: wierzcholekStartowy.rodzic, wierzcholekStartowy oraz d // Jeśli rodzic == null wtedy wszystkie d dozwolone if (wierzcholekStartowy.Rodzic == null) { result = SzukajNieskojarzonego(d, wZbiorze); if (result != null) { break; } } else { // Każde d dozwolone jeżeli: startowy skojarzony z: rodzicem lub d if (CzySkojarzone(wierzcholekStartowy.Wartosc, wierzcholekStartowy.Rodzic.Wartosc) || CzySkojarzone(wierzcholekStartowy.Wartosc, d.Wartosc)) { result = SzukajNieskojarzonego(d, wZbiorze); } if (result != null) { break; } } } } return(result); }