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); } }
static void MaksymalneSkojarzenie() { //GrafNDzielny g = new GrafNDzielny(new Graf(6)); //g.DodajKrawedzNieskierowana(0, 3); //g.DodajKrawedzNieskierowana(0, 4); //g.DodajKrawedzNieskierowana(1, 3); //g.DodajKrawedzNieskierowana(1, 4); //g.DodajKrawedzNieskierowana(1, 5); //g.DodajKrawedzNieskierowana(2, 3); //g.UmiescWZbiorze(3, 1); //g.UmiescWZbiorze(4, 1); //g.UmiescWZbiorze(5, 1); GrafNDzielny g = new GrafNDzielny(new Graf(10)); g.DodajKrawedzNieskierowana(0, 5); g.DodajKrawedzNieskierowana(0, 6); g.DodajKrawedzNieskierowana(1, 5); g.DodajKrawedzNieskierowana(1, 6); g.DodajKrawedzNieskierowana(1, 7); g.DodajKrawedzNieskierowana(2, 6); g.DodajKrawedzNieskierowana(2, 7); g.DodajKrawedzNieskierowana(2, 8); g.DodajKrawedzNieskierowana(3, 7); g.DodajKrawedzNieskierowana(4, 5); g.DodajKrawedzNieskierowana(4, 7); g.DodajKrawedzNieskierowana(3, 9); g.UmiescWZbiorze(5, 1); g.UmiescWZbiorze(6, 1); g.UmiescWZbiorze(7, 1); g.UmiescWZbiorze(8, 1); g.UmiescWZbiorze(9, 1); g.SkojarzeniePoczatkowe(0, 1); Console.WriteLine("Skojarzenie poczatkowe:"); WypiszSkojarzenia(g.TablicaSkojarzen); Console.WriteLine(); g.SkojarzenieMaksymalne(0, 1); Console.WriteLine("Skojarzenie maksymalne:"); WypiszSkojarzenia(g.TablicaSkojarzen); }
public void SkojarzenieMaksymalne(int zbior1, int zbior2) { if (tablicaSkojarzen == null) { SkojarzeniePoczatkowe(zbior1, zbior2); } do { var sciezka = ZnajdzDrogeRozszerzajaca(zbior1, zbior2); if (sciezka == null) { break; } GrafNDzielny g = new GrafNDzielny(this); g.UsunKrawedzie(); bool[,] sk = new bool[iloscWierzcholkow, iloscWierzcholkow]; bool[,] sc = new bool[iloscWierzcholkow, iloscWierzcholkow]; for (int i = 1; i < sciezka.Count; i++) { sc[sciezka[i], sciezka[i - 1]] = true; sc[sciezka[i - 1], sciezka[i]] = true; } for (int i = 0; i < tablicaSkojarzen.Length; i++) { if (tablicaSkojarzen[i] != nieskojarzony) { sk[i, tablicaSkojarzen[i]] = true; sk[tablicaSkojarzen[i], i] = true; } } for (int i = 0; i < iloscWierzcholkow; i++) { for (int j = 0; j < iloscWierzcholkow; j++) { if (sc[i, j] ^ sk[i, j]) { g.DodajKrawedzSkierowana(i, j); } } } g.SkojarzeniePoczatkowe(zbior1, zbior2); tablicaSkojarzen = g.TablicaSkojarzen; } while (true); }
public GrafNDzielny(GrafNDzielny g) : base(g) { zbioryWierzcholkow = g.ZbioryWierzcholkow; }