public static List <int> DFS(List <wierzcholek> lista, int start) { List <int> rozwiazanie = new List <int>(); List <int> stos = new List <int>(); stos.Add(start); rozwiazanie.Add(start); wybierzWierzcholek(lista, start).odwiedz(); while (stos.Count > 0) { wierzcholek obecny = wybierzWierzcholek(lista, stos.Last()); List <int> sasiedzi = obecny.dajSasiadow(); bool znalazl = false; foreach (int i in sasiedzi) { wierzcholek nowy = wybierzWierzcholek(lista, i); if (nowy.CzyOdwiedzony() == false) { znalazl = true; nowy.odwiedz(); stos.Add(nowy.dajNumer()); rozwiazanie.Add(nowy.dajNumer()); break; } } if (znalazl == false) { stos.Remove(stos.Last()); } } return(rozwiazanie); }
public static List <int> DFS(List <wierzcholek> lista) { List <int> rozwiazanie = new List <int>(); List <int> stos = new List <int>(); wierzcholek obecny = lista.ElementAt(0); stos.Add(obecny.dajNumer()); rozwiazanie.Add(obecny.dajNumer()); while (stos.Count > 0) { List <int> sasiedzi = obecny.dajSasiadow(); bool znalazl = false; foreach (int i in sasiedzi) { wierzcholek nowy = wybierzWierzcholek(lista, i); if (czyWybrany(rozwiazanie, nowy.dajNumer()) == false) { znalazl = true; stos.Add(nowy.dajNumer()); rozwiazanie.Add(nowy.dajNumer()); obecny = nowy; break; } } if (znalazl == false) { stos.Remove(stos.Last()); if (stos.Count > 0) { obecny = wybierzWierzcholek(lista, stos.Last()); } } } return(rozwiazanie); }
static void Main(string[] args) { List <List <int> > macierz = new List <List <int> >(); var s = new FileInfo(Directory.GetCurrentDirectory()); var s2 = s.Directory.Parent.Parent; String sciezka = s2.ToString() + "\\dane.csv"; using (var reader = new StreamReader(sciezka)) { while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(','); List <int> zad = new List <int>(); for (int x = 0; x < values.Length; x++) { zad.Add(Convert.ToInt32(values[x])); } macierz.Add(zad); } } bool flaga = true; for (int x = 1; x <= macierz.Count; x++) { for (int y = x + 1; y <= macierz.Count; y++) { int jeden = dajPole(macierz, x, y); int dwa = dajPole(macierz, y, x); if (jeden != dwa) { flaga = false; } } } if (flaga == false) { Console.WriteLine("Podana macierz nie jest grafem"); Console.ReadKey(); return; } List <wierzcholek> wierzcholki = new List <wierzcholek>(); for (int numer = 1; numer <= macierz.Count; numer++) { wierzcholek nowy = new wierzcholek(numer); List <int> zad = macierz.ElementAt((numer - 1)); for (int i = 1; i <= zad.Count; i++) { int a = i - 1; if (zad.ElementAt(a) == 1) { nowy.dodajSasiada(i); } } wierzcholki.Add(nowy); } foreach (wierzcholek w in wierzcholki) { w.napisz(); } List <int> stos = new List <int>(); wierzcholek obecny = wybierzWierzcholek(wierzcholki, 1); obecny.naDrzewo(); List <sciezka> sciezki = new List <sciezka>(); stos.Add(1); while (stos.Count > 0) { List <int> sasiedzi = obecny.dajSasiadow(); bool znalazl = false; foreach (int i in sasiedzi) { wierzcholek nowy = wybierzWierzcholek(wierzcholki, i); if (nowy.czyNaDrzewie() == false) { znalazl = true; nowy.naDrzewo(); stos.Add(nowy.dajNumer()); sciezki.Add(new sciezka(obecny.dajNumer(), nowy.dajNumer())); obecny = nowy; break; } } if (znalazl == false) { stos.Remove(stos.Last()); if (stos.Count > 0) { obecny = wybierzWierzcholek(wierzcholki, stos.Last()); } } } Console.WriteLine(); flaga = true; foreach (wierzcholek w in wierzcholki) { if (w.czyNaDrzewie() == false) { flaga = false; } } if (flaga == false) { Console.WriteLine("Podany graf nie jest spójny"); } else { Console.WriteLine("Podany graf zawiera następujące drzewo spójności"); string wynik = ""; foreach (sciezka x in sciezki) { wynik += x.opis(); wynik += ", "; } wynik.Remove(wynik.Last()); wynik.Remove(wynik.Last()); Console.WriteLine(wynik); } Console.ReadKey(); }
static void Main(string[] args) { Console.WriteLine("Witam w analizatorze ciągów grafowych by wardasz"); Console.WriteLine("Podaj ciąg:"); string ciag = Console.ReadLine(); List <wierzcholek> elementy = new List <wierzcholek>(); var czesci = ciag.Split(','); for (int x = 0; x < czesci.Length; x++) { int a = x + 1; int b = Convert.ToInt32(czesci[x]); elementy.Add(new wierzcholek(a, b)); } while (suma(elementy) > 0) { elementy.Sort((a, b) => (a.porownaj(b))); wierzcholek kasowany = elementy.ElementAt(0); int ile = kasowany.dajAktualny(); kasowany.zeruj(); int kasowanyNumer = kasowany.dajNumer(); for (int x = 1; x <= ile; x++) { wierzcholek roboczy = elementy.ElementAt(x); int roboczyNumer = roboczy.dajNumer(); roboczy.obniz(); kasowany.dodajSasiada(roboczyNumer); roboczy.dodajSasiada(kasowanyNumer); } foreach (wierzcholek w in elementy) { if (w.dajAktualny() < 0) { Console.WriteLine("Podany ciąg nie jest ciągiem grafowym"); Console.ReadKey(); return; } } } //tworzenie maciezy List <List <int> > maciez = new List <List <int> >(); for (int x = 0; x < elementy.Count; x++) { List <int> nowa = new List <int>(); for (int y = 0; y < elementy.Count; y++) { nowa.Add(0); } maciez.Add(nowa); } foreach (wierzcholek w in elementy) { int numer = w.dajNumer(); numer--; List <int> sasiedzi = w.dajSasiadow(); foreach (int i in sasiedzi) { int n = i - 1; maciez.ElementAt(numer)[n]++; } } //wypisywanie int rozmiar = maciez.Count; string szczyt = " | "; string linia = "--+"; for (int x = 1; x <= rozmiar; x++) { szczyt += x; if (x < 10) { szczyt += " "; } szczyt += " "; linia += "---"; } Console.WriteLine(szczyt); Console.WriteLine(linia); int licznik = 1; foreach (List <int> zad in maciez) { string kolejna = licznik.ToString(); if (licznik < 10) { kolejna += " "; } kolejna += "|"; foreach (int pole in zad) { kolejna += " "; kolejna += pole.ToString(); if (pole < 10) { kolejna += " "; } } Console.WriteLine(kolejna); licznik++; } Console.ReadKey(); }