/// <summary> /// Duomenu ivedimas is konsoles /// </summary> /// <returns>Suformuotas grafas</returns> static Grafas DuomenuIvedimas() { Grafas duomenys = new Grafas(); Console.WriteLine("Iveskite grafo virsuniu sk.: "); int n = int.Parse(Console.ReadLine()); for (int i = 0; i < n; i++) { Console.WriteLine("Iveskite {0} virsunes kaimynes, atskirdami " + "jas tarpo simboliu: ", i + 1); var kaimynes = Console.ReadLine(); string[] parts = kaimynes.Split(' '); List <int> gretimosVirsunes = new List <int>(); foreach (var part in parts) { gretimosVirsunes.Add(int.Parse(part)); } duomenys.GretimumoStrukturaAdd(i + 1, gretimosVirsunes); } return(duomenys); }
/// <summary> /// Įvedimas kode testavimui supaprastinti /// </summary> /// <returns>Suformuotas grafas</returns> static Grafas HardcodedIvedimas() { Grafas duomenys = new Grafas(); duomenys.GretimumoStrukturaAdd(1, new List <int>() { 3, 5, 2 }); duomenys.GretimumoStrukturaAdd(2, new List <int>() { 1, 6 }); duomenys.GretimumoStrukturaAdd(3, new List <int>() { 1, 4, 6 }); duomenys.GretimumoStrukturaAdd(4, new List <int>() { 3, 6 }); duomenys.GretimumoStrukturaAdd(5, new List <int>() { 1 }); duomenys.GretimumoStrukturaAdd(6, new List <int>() { 2, 3, 4 }); return(duomenys); }
static void Main() { // Grafas duomenys = duomenuIvedimas(); Grafas duomenys = HardcodedIvedimas(); GrafoSpausdinimas(duomenys, "Pradinis grafas"); //Įvedamas poaibis List <int> poaibis = IvestiPoaibi(); //Suformuojamas naujas poaibis ir atspausdinamas Grafas suformuotas = FormuotiNaujaGrafa(duomenys, poaibis); GrafoSpausdinimas(suformuotas, "Grafas, suformuotas is nurodyto " + "virsuniu poaibio"); ////Surandamos grafos kraštinės //suformuotas.SurastiKrastines(); Console.WriteLine("Iveskite savybe, kuria norite tikrinti [1, 2, 3, 4, 5, 6]: "); int savybe = int.Parse(Console.ReadLine()); if (MedzioPatikra(suformuotas, savybe)) { Console.WriteLine("Indukuotasis grafas - medis"); } else { Console.WriteLine("Indukuotasis grafas - ne medis"); } }
/// <summary> /// Metodas, kuris patikrina 6 medžio egzistavimo sąlygos teisingumą /// </summary> /// <param name="grafas">Duotas grafas</param> /// <returns>True, jeigu sąlyga tenkinama</returns> static bool Savybe6(Grafas grafas) { bool galioja = true; List <int> pasikartojimuList = new List <int>(); foreach (var rysys in grafas.gretimumoStruktura) { int virsune = rysys.Key; int pasikartojimu = KiekPasikartoja(grafas, virsune); //jei į viršūnę galima ateiti iš daugiau nei 2 kitų viršūnių, galime //teigti, kad grafas nėra medis ir daugiau galime nebetikrinti if (pasikartojimu != 1 && pasikartojimu != 2) { galioja = false; break; } if (!pasikartojimuList.Contains(pasikartojimu)) { pasikartojimuList.Add(pasikartojimu); } } if (pasikartojimuList.Count() == 1) { galioja = false; } return(galioja); }
/// <summary> /// Metodas, sukuriantis naują identišką grafą /// </summary> /// <param name="originalus">Originalus grafas</param> /// <returns>Originalaus grafo kopija</returns> static Grafas KopijuotiGrafa(Grafas originalus) { Grafas kopija = new Grafas(); foreach (var rysys in originalus.gretimumoStruktura) { kopija.GretimumoStrukturaAdd(rysys.Key, rysys.Value); } return(kopija); }
/// <summary> /// 3 savybė - neturi ciklų ir , m = n – 1 /// </summary> /// <returns>True | False</returns> static bool Savybe3(Grafas graph) { DFSPradzia(graph, true); graph.SurastiKrastines(); if (graph.ciklai.Count() == 0 & graph.krastines.Count() == graph.n - 1) { return(true); } else { return(false); } }
/// <summary> /// 1 savybė - jungusis ir neturi ciklų /// </summary> /// <returns>True | False</returns> static bool Savybe1(Grafas graph) { DFSPradzia(graph, true); if (graph.arJungus && graph.ciklai.Count() == 0) { return(true); } else { return(false); } }
/// <summary> /// Grafo atspausdinimo gretimumo struktura metodas /// </summary> /// <param name="grafas">Grafas</param> /// <param name="antr">Antraste</param> static void GrafoSpausdinimas(Grafas grafas, string antr) { Console.Clear(); Console.WriteLine(antr); foreach (var virsune in grafas.gretimumoStruktura) { Console.Write("{0}: ", virsune.Key); foreach (var rysys in virsune.Value) { Console.Write("{0} ", rysys); } Console.WriteLine(""); } }
/// <summary> /// Metodas, kuris patikrina 5 medžio savybę /// </summary> /// <param name="graph">Indukuotasis grafas</param> /// <returns>True | False</returns> static bool Savybe5(Grafas graph) { DFSPradzia(graph, false); if (graph.arJungus) { Grafas naujas = KopijuotiGrafa(graph); naujas.SurastiKrastines(); return(DFSSalinantBriauna(naujas)); } else { return(false); } }
/// <summary> /// 2 savybė - jungusis ir , m = n – 1 /// </summary> /// <returns>True | False</returns> static bool Savybe2(Grafas graph) { DFSPradzia(graph, false); graph.SurastiKrastines(); if (graph.arJungus && graph.krastines.Count() == graph.n - 1) { return(true); } else { return(false); } }
/// <summary> /// Metodas, kuris patikrina ketvirtą medžio savybę /// </summary> /// <param name="graph">Indukuotasis grafas</param> /// <returns>True | False</returns> static bool Savybe4(Grafas graph) { DFSPradzia(graph, true); if (graph.ciklai.Count() == 0) { Console.WriteLine("\r\nIveskite nauja briauna, jungiancia ne gretimas virsunes: "); string input = Console.ReadLine(); string[] parts = input.Split(' '); Grafas naujas = KopijuotiGrafa(graph); naujas.PridetiBriauna(int.Parse(parts[0]), int.Parse(parts[1])); DFSPradzia(naujas, true); return(!(naujas.ciklai.Count() == 1)); } return(false); }
/// <summary> /// Metodas, kuris vykdo DFS tiek kartų, kiek grafas turi viršūnių, /// kiekvieną kartą pašalindamas vis skirtingą viršūnę. Jeigu /// pašalinus kurią nors viršūnę ir atlikus DFS paaiškėja, kad grafas /// tapo nebe jungus, reiškia, kad grafas yra medis. (5 savybė) /// </summary> /// <param name="graph">Duotasis grafas</param> /// <returns>True arba False</returns> static bool DFSSalinantBriauna(Grafas graph) { bool rezultatas = false; Grafas kopija; foreach (var briauna in graph.krastines) { kopija = KopijuotiGrafa(graph); kopija.PasalintiKrastine(briauna.Key, briauna.Value); DFSPradzia(kopija, false); if (!kopija.arJungus) { rezultatas = true; } else { break; } } return(rezultatas); }