/// <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);
        }