Advertisement
pinionszki

all

Jan 22nd, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 54.68 KB | None | 0 0
  1. //BSF
  2. static class Zadanie4 //BFS
  3.         {
  4.             static int n = 7;
  5.             static List<List<bool>> graph = new List<List<bool>>
  6.             {
  7.                 new List<bool>(){false, false, false, false, false, false, false},
  8.                 new List<bool>(){false, false, true, false, false, true, false},
  9.                 new List<bool>(){false, true, false, true, false, true, false},
  10.                 new List<bool>(){false, false, true, false, true, false, false},
  11.                 new List<bool>(){false, false, false, true, false, true, true},
  12.                 new List<bool>(){false, true, true, false, true, false, false},
  13.                 new List<bool>(){false, false, false, false, true, false, false}
  14.             };
  15.             static bool[] visited = new bool[n];
  16.  
  17.             public static void BFS()
  18.             {
  19.                 var paths = Reconstruct(Solve(1, 7), 2);
  20.             }
  21.  
  22.             public static List<List<int>> Reconstruct(int?[] prev, int s)
  23.             {
  24.                 List<List<int>> paths = new List<List<int>>();
  25.  
  26.                 for (int i = s; i < prev.Length; i++)
  27.                 {
  28.                     List<int> path = new List<int>();
  29.                     int? val = i;
  30.                     while (val != null)
  31.                     {
  32.                         path.Add((int)val);
  33.                         val = prev[(int)val];
  34.  
  35.                     }
  36.  
  37.                     path.Reverse();
  38.                     paths.Add(path);
  39.                 }
  40.  
  41.                 return paths;
  42.             }
  43.  
  44.             public static int?[] Solve(int s, int n)
  45.             {
  46.                 int?[] prev = new int?[n];
  47.  
  48.                 Queue<int> q = new Queue<int>();
  49.                 q.Enqueue(s);
  50.                 visited[s] = true;
  51.  
  52.                 while (q.Count != 0)
  53.                 {
  54.                     int node = q.Dequeue();
  55.                     var neighbours = graph[node];
  56.  
  57.                     for (int i = 0; i < neighbours.Count; i++)
  58.                     {
  59.                         if (neighbours[i] && !visited[i])
  60.                         {
  61.                             prev[i] = node;
  62.                             visited[i] = true;
  63.                             q.Enqueue(i);
  64.                         }
  65.                     }
  66.                 }
  67.  
  68.                 return prev;
  69.             }
  70.         }
  71.  
  72. static void Zadanie4()
  73.         {
  74.              int n = 7;
  75.              List<List<bool>> graph = new List<List<bool>>
  76.             {
  77.                 new List<bool>(){false, false, false, false, false, false, false},
  78.                 new List<bool>(){false, false, true, false, false, true, false},
  79.                 new List<bool>(){false, true, false, false, false, true, false},
  80.                 new List<bool>(){false, false, true, false, true, false, false},
  81.                 new List<bool>(){false, false, false, true, false, true, true},
  82.                 new List<bool>(){false, true, true, false, true, false, false},
  83.                 new List<bool>(){false, false, false, false, true, false, false}
  84.             };
  85.              bool[] visited = new bool[7];
  86.              var drzewo = Solve(1, 6, graph, visited);
  87.         }
  88.  
  89.         static List<List<int>> Solve(int s, int n, List<List<bool>> graph, bool[] visited)
  90.         {
  91.             List<List<int>> drzewo = new List<List<int>>();
  92.  
  93.             Queue<int> q = new Queue<int>();
  94.             q.Enqueue(s);
  95.             visited[s] = true;
  96.  
  97.             while (q.Count != 0)
  98.             {
  99.                 int node = q.Dequeue();
  100.                 var neighbours = graph[node];
  101.                 for (int i = 0; i < neighbours.Count; i++)
  102.                 {
  103.                     if (neighbours[i] && !visited[i])
  104.                     {
  105.                         drzewo.Add(new List<int>() { node, i });
  106.                         q.Enqueue(i);
  107.                         visited[i] = true;
  108.                     }
  109.                 }
  110.             }
  111.  
  112.             return drzewo;
  113.         }
  114.  
  115. //PreOrder
  116. using System;
  117. using System.Collections.Generic;
  118. using System.Linq;
  119. using System.Text;
  120. using System.Threading.Tasks;
  121.  
  122. namespace PreORderv2
  123. {
  124.     class Program
  125.     {
  126.         static void Main(string[] args)
  127.         {
  128.             int[] t = { 6, 3, 1, 2, 4, 5, 7 };
  129.             //int[] t = { 6, 3, 1, 2, 4, 7, 5 };
  130.             Tree root = null;
  131.  
  132.             int i = 0;
  133.             bool badTree = false;
  134.  
  135.             root = constructTree(t, ref i, Int32.MaxValue);
  136.  
  137.             WypiszDrzewo(root);
  138.  
  139.             Console.ReadKey();
  140.         }
  141.  
  142.         class Tree
  143.         {
  144.             public int val;
  145.             public Tree left;
  146.             public Tree right;
  147.  
  148.             public Tree(int val)
  149.             {
  150.                 this.val = val;
  151.             }
  152.         }
  153.  
  154.         static void WypiszDrzewo(Tree root)
  155.         {
  156.             if (root == null)
  157.                 return;
  158.  
  159.             Queue<Tree> q = new Queue<Tree>();
  160.             q.Enqueue(root);
  161.  
  162.             while (true)
  163.             {
  164.                 int nodeCount = q.Count;
  165.                 if (nodeCount == 0)
  166.                     break;
  167.  
  168.                 while (nodeCount > 0)
  169.                 {
  170.                     Tree node = q.Dequeue();
  171.                     Console.Write(node.val + " ");
  172.  
  173.                     if (node.left != null)
  174.                         q.Enqueue(node.left);
  175.                     if (node.right != null)
  176.                         q.Enqueue(node.right);
  177.                     nodeCount--;
  178.                 }
  179.                 Console.WriteLine();
  180.             }
  181.         }
  182.         static bool IsValid(int[] pre)
  183.         {
  184.             Stack<int> s = new Stack<int>();
  185.             int? lowerBound = null;
  186.  
  187.             for (int i = 0; i < pre.Length; i++)
  188.             {
  189.                 if (lowerBound != null && pre[i] < lowerBound) return false;
  190.                 while (s.Count != 0 && s.Peek() < pre[i]) lowerBound = s.Pop();
  191.                 s.Push(pre[i]);
  192.             }
  193.  
  194.             return true;
  195.         }
  196.  
  197.         static Tree constructTree(int[] pre, ref int i, int high)
  198.         {
  199.             if (!IsValid(pre)) return null;
  200.             else
  201.             {
  202.                 if (i >= pre.Length || pre[i] > high) return null;
  203.  
  204.                 Tree root = new Tree(pre[i++]);
  205.                 root.left = constructTree(pre, ref i, root.val);
  206.                 root.right = constructTree(pre, ref i, high);
  207.                 return root;
  208.             }
  209.         }
  210.     }
  211. }
  212.  
  213.  
  214. using System;
  215. using System.Collections.Generic;
  216. using System.Linq;
  217. using System.Text;
  218. using System.Threading.Tasks;
  219.  
  220. namespace PreOreder
  221. {
  222.     class Program
  223.     { //odtwórz drzewo na bazie przejscia go w PreOrder
  224.         static void Main(string[] args)
  225.         {
  226.             int[] tab = { 6, 3, 1, 2, 4, 5, 7 };
  227.             //int[] tab = { 6, 3, 1, 2, 4, 7, 5 };
  228.            
  229.             Drzewo d = Drzewo.BudujZPreOrder(tab);
  230.  
  231.             if (d != null)
  232.                 d.Wyswietl();
  233.             else
  234.                 Console.WriteLine("Drzewo było null");
  235.  
  236.             Console.ReadKey();
  237.         }
  238.     }
  239.    
  240.     class Drzewo
  241.     {
  242.         public Element głowa;
  243.  
  244.         public static Drzewo BudujZPreOrder(int[] tab)
  245.         {
  246.             Drzewo d = new Drzewo();
  247.             d.głowa = new Element(tab[0]);
  248.  
  249.             for (int i = 1; i < tab.Length; i++)
  250.             {
  251.                 Element tmp = d.głowa;
  252.  
  253.                 while(tmp != null)
  254.                 {
  255.                     if (tab[i] < tmp.wartosc)
  256.                     {
  257.                         if (tmp.prawy != null)
  258.                         {
  259.                             return null;
  260.                         }
  261.                         if (tmp.lewy != null)
  262.                         {
  263.                             tmp = tmp.lewy;
  264.                         }
  265.                         else
  266.                         {
  267.                             tmp.lewy = new Element(tab[i]);
  268.                             tmp = null;
  269.                         }
  270.                     }
  271.                     else
  272.                     {
  273.                         if (tmp.prawy != null)
  274.                         {
  275.                             tmp = tmp.prawy;
  276.                         }
  277.                         else
  278.                         {
  279.                             tmp.prawy = new Element(tab[i]);
  280.                             tmp = null;
  281.                         }
  282.                     }
  283.                 }
  284.             }
  285.             return d;
  286.         }
  287.  
  288.         public void Wyswietl()
  289.         {
  290.             if (głowa == null)
  291.             {
  292.                 Console.WriteLine("Drzewo bez glowy!");
  293.                 return;
  294.             }
  295.  
  296.             głowa.WyswietlPoddrzewo();
  297.         }
  298.  
  299.  
  300.     }
  301.     class Element
  302.     {
  303.         public Element(int w) => wartosc = w;
  304.         public int wartosc;
  305.         public Element lewy;
  306.         public Element prawy;
  307.  
  308.         public void WyswietlPoddrzewo()
  309.         {
  310.             Console.WriteLine(wartosc + " ");
  311.             if (lewy != null)
  312.             {
  313.                 lewy.WyswietlPoddrzewo();
  314.             }
  315.             if (prawy != null)
  316.             {
  317.                 prawy.WyswietlPoddrzewo();
  318.             }
  319.         }
  320.  
  321.         public override string ToString()
  322.         {
  323.             return wartosc.ToString();
  324.         }
  325.     }
  326. }
  327.  
  328.  
  329.  
  330. //metody in, post, pre
  331. using System;
  332. using System.Collections;
  333.  
  334. //Zadanie 2
  335. //Dla drzewa binarnego w implementacji dowiązaniowej napisz:
  336. //a) metodę wyszukującą czy istnieje element(węzeł) o zadanej wartości.
  337. //b) metodę przechodzenia pre-order nierekurencyjną(wsk.wykorzystaj stos)
  338. // klasa pomocnicza Węzeł
  339. class Węzeł
  340. {
  341.     public String wartość;
  342.     public Węzeł lewy;
  343.     public Węzeł prawy;
  344. }
  345.  
  346. // klasa Drzewo
  347. class Drzewo
  348. {
  349.     public Węzeł korzeń;
  350. }
  351.  
  352. class Program
  353. {
  354.     static Węzeł UtwórzWęzeł(String wartość)
  355.     {
  356.         Węzeł węzeł = new Węzeł();
  357.         węzeł.wartość = wartość;
  358.         return węzeł;
  359.     }
  360.  
  361.     static void InicjujWęzeł(Węzeł węzeł, String wartość)
  362.     {
  363.         węzeł.wartość = wartość;
  364.     }
  365.  
  366.     static void DodajLewy(Węzeł węzeł, Węzeł dziecko)
  367.     {
  368.         węzeł.lewy = dziecko;
  369.     }
  370.     static void DodajPrawy(Węzeł węzeł, Węzeł dziecko)
  371.     {
  372.         węzeł.prawy = dziecko;
  373.     }
  374.  
  375.     // pre-order
  376.     static void WypisujPre(Węzeł węzeł)
  377.     {
  378.         if (węzeł == null) return;
  379.         Console.Write(węzeł.wartość + " ");
  380.         WypisujPre((Węzeł)węzeł.lewy);
  381.         WypisujPre((Węzeł)węzeł.prawy);
  382.     }
  383.  
  384.     // post-order
  385.     static void WypisujPost(Węzeł węzeł)
  386.     {
  387.         if (węzeł == null) return;
  388.         WypisujPost((Węzeł)węzeł.lewy);
  389.         WypisujPost((Węzeł)węzeł.prawy);
  390.         Console.Write(węzeł.wartość + " ");
  391.     }
  392.  
  393.     // in-order
  394.     static void WypisujIn(Węzeł węzeł)
  395.     {
  396.         if (węzeł == null) return;
  397.         WypisujIn((Węzeł)węzeł.lewy);
  398.         Console.Write(węzeł.wartość + " ");
  399.         WypisujIn((Węzeł)węzeł.prawy);
  400.     }
  401.  
  402.     static int Wysokość(Węzeł węzeł)
  403.     {
  404.         int wysokość = 0;
  405.         if (węzeł == null) return 0;
  406.         if (węzeł.lewy != null)
  407.             wysokość = Math.Max(wysokość, Wysokość(węzeł.lewy) + 1);
  408.         if (węzeł.prawy != null)
  409.             wysokość = Math.Max(wysokość, Wysokość(węzeł.prawy) + 1);
  410.         return wysokość;
  411.     }// Zwraca wynik
  412.  
  413.     // metodę wyszukującą czy istnieje element(węzeł) o zadanej wartości.
  414.  
  415.  
  416.     static Węzeł CzyIstniejeWęzeł(Drzewo d, string s)
  417.     {
  418.         return CzyIstniejeWęzeł(d.korzeń, s);
  419.     }
  420.     static Węzeł CzyIstniejeWęzeł(Węzeł w, string s)
  421.     {
  422.         if (w == null) return null;
  423.  
  424.         if (w.wartość == s) return w; // znalazłem
  425.         if (w.lewy != null)
  426.         {
  427.             Węzeł t = CzyIstniejeWęzeł(w.lewy, s);
  428.             if (t != null) return t; // znalazłem
  429.         }
  430.         return CzyIstniejeWęzeł(w.prawy, s);
  431.     }
  432.  
  433.     //metodę przechodzenia pre-order nierekurencyjną
  434.     static void WypisujPreNierekurencyjnie(Węzeł węzeł)
  435.     {
  436.         if (węzeł == null) return;
  437.         Stack s = new Stack();
  438.         s.Push(węzeł);
  439.         while(s.Count>0)
  440.         {
  441.             Węzeł tmp = (Węzeł)s.Pop();
  442.             Console.Write(tmp.wartość + " ");
  443.             if(tmp.prawy!=null)
  444.                 s.Push(tmp.prawy);
  445.             if(tmp.lewy!=null)
  446.                 s.Push(tmp.lewy);
  447.         }
  448.     }
  449.     static void Main()
  450.     {
  451.         Drzewo drzewo = new Drzewo();
  452.  
  453.         drzewo.korzeń = UtwórzWęzeł("F");
  454.         Węzeł wB = UtwórzWęzeł("B");
  455.         Węzeł wA = UtwórzWęzeł("A");
  456.         Węzeł wC = UtwórzWęzeł("C");
  457.         Węzeł wD = UtwórzWęzeł("D");
  458.         Węzeł wE = UtwórzWęzeł("E");
  459.         Węzeł wG = UtwórzWęzeł("G");
  460.         Węzeł wH = UtwórzWęzeł("H");
  461.         Węzeł wI = UtwórzWęzeł("I");
  462.         Węzeł wX = UtwórzWęzeł("X");
  463.  
  464.         DodajLewy(wD, wC);
  465.         DodajPrawy(wD, wE);
  466.         DodajPrawy(wA, wX);
  467.         DodajLewy(wB, wA);
  468.         DodajPrawy(wB, wD);
  469.  
  470.         DodajLewy(wI, wH);
  471.         DodajPrawy(wG, wI);
  472.  
  473.         DodajLewy(drzewo.korzeń, wB);
  474.         DodajPrawy(drzewo.korzeń, wG);
  475.  
  476.         WypisujPre(drzewo.korzeń);
  477.         Console.WriteLine();
  478.         WypisujPost(drzewo.korzeń);
  479.         Console.WriteLine();
  480.         WypisujIn(drzewo.korzeń);
  481.         Console.WriteLine();
  482.         Console.WriteLine("wysokość = " + Wysokość(drzewo.korzeń));
  483.  
  484.         Węzeł t = CzyIstniejeWęzeł(drzewo, "X");
  485.         Console.WriteLine(t != null);
  486.         t = CzyIstniejeWęzeł(drzewo, "A");
  487.         Console.WriteLine(t != null);
  488.         t = CzyIstniejeWęzeł(drzewo, "G");
  489.         Console.WriteLine(t != null);
  490.         t = CzyIstniejeWęzeł(drzewo, "Z");
  491.         Console.WriteLine(t != null);
  492.  
  493.         WypisujPreNierekurencyjnie(drzewo.korzeń);
  494.  
  495.         Console.ReadKey();
  496.     }
  497. }
  498.  
  499. //Gafy zajecia
  500. using System;
  501. using System.Collections.Generic;
  502. using System.Linq;
  503. using System.Text;
  504. using System.Threading.Tasks;
  505.  
  506. //Zadanie 1
  507. //A)
  508. //Dla prostego grafu nieskierowanego bez wag krawędzi, napisz metodę
  509. //    konwertująca reprezentację w postaci macierzy sąsiedztw na reprezentację w postaci list sąsiedztwa.
  510. //    Przetestuj jej działanie na przykład dla grafu z wykładu.
  511.  
  512.  
  513. class Program
  514. {
  515.     // numeracja od 0
  516.     static List<int>[] KonwersjaNaListy(int[,] G)
  517.     {
  518.         List<int>[] graf = new List<int>[G.GetLength(0)];
  519.         for(int i =0; i< graf.Length;i++)
  520.         {
  521.             graf[i] = new List<int>();
  522.             for (int j = 0; j < G.GetLength(0); j++)
  523.                 if (G[i, j] != 0) graf[i].Add(j);
  524.         }
  525.         return graf;
  526.     }
  527.     static void Main(string[] args)
  528.     {
  529.         int[,] G = {
  530.         { 0, 1, 0, 0, 1, 0 },
  531.         { 1, 0, 1, 0, 1, 0 },
  532.         { 0, 1, 0, 1, 0, 0 },
  533.         { 0, 0, 1, 0, 1, 1 },
  534.         { 1, 1, 0, 1, 0, 0 },
  535.         { 0, 0, 0, 1, 0, 0 }
  536.         };
  537.  
  538.         List<int>[] graf = KonwersjaNaListy(G);
  539.         for (int i = 0; i < graf.Length; i++)
  540.         {
  541.             Console.Write("L("+i+") = {");
  542.             for (int j = 0; j < graf[i].Count-1; j++)
  543.                Console.Write(graf[i][j]+", ");
  544.             Console.Write(graf[i][graf[i].Count - 1] + "}");
  545.             Console.WriteLine();
  546.         }
  547.  
  548.         Console.ReadKey();
  549.     }
  550. }
  551.  
  552. using System;
  553. using System.Collections.Generic;
  554. using System.Linq;
  555. using System.Text;
  556. using System.Threading.Tasks;
  557.  
  558. //B)
  559. //| 1 0 0 3 0 0 7 |
  560. //| 0 0 2 0 4 0 1 |
  561. //| 0 2 0 4 1 2 3 |
  562. //| 3 0 4 0 5 3 3 |
  563. //| 0 4 1 5 0 1 2 |
  564. //| 0 0 2 3 1 0 2 |
  565. //| 7 1 3 3 2 2 0 |
  566.  
  567. //Narysuj graf G(w B wartości oznaczają wagi a nie liczbę krawędzi).
  568. //Napisz metodę przechodzenia grafu w głąb i zastosuj dla grafu G
  569.  
  570. class Program
  571. {
  572.     //    Bierzemy pierwszy wierzchołek, kłADZIEMY NA STOS .
  573.     //    Następnie kolejno pobieramy wierzchołek ze stosu,
  574.     //    jeśli nie był już odwiedzony to odwiedzamy go
  575.     //    i wkładamy wszystkich jego nieodwiedzonych sąsiadów na stos
  576.     //    w kolejności od tego z największym indeksem (czyli od końca).
  577.     //    Kontynuujemy aż stos będzie pusty.
  578.  
  579.         // NA MACIERZY SASIEDZTWA
  580.  
  581.     static void DFS(int[,] G, int v)
  582.     {        
  583.         Stack<int> stos = new Stack<int>();
  584.         bool[] odwiedzony = new bool[G.GetLength(0)];
  585.         stos.Push(v);
  586.         while (stos.Count > 0)
  587.         {
  588.             v = stos.Pop();
  589.             if (!odwiedzony[v])
  590.             {
  591.                 Console.WriteLine(v);
  592.                 odwiedzony[v] = true;
  593.                 // wkładam od końca wtedy kompatybilnie z rekurencją
  594.                 for (int i = G.GetLength(0) -1; i >= 0; i--)
  595.                 {
  596.                     if (G[v,i] != 0 && !odwiedzony[i])
  597.                     {                      
  598.                         stos.Push(i);
  599.                     }
  600.                 }
  601.             }            
  602.         }
  603.     }
  604.  
  605.     //REKURENCJA
  606.     // NA MACIERZY SASIEDZTWA
  607.  
  608.     static bool[] visited ;
  609.  
  610.     static void DFSRekurencja(int[,] G, int v)
  611.     {
  612.         Console.WriteLine(v);
  613.         visited[v] = true;
  614.         // tu wkładam po kolei, nie od końca
  615.         for (int i = 0; i < G.GetLength(0); i++)
  616.         {
  617.             if (G[v, i] != 0 && !visited[i])
  618.             {
  619.                 DFSRekurencja(G, i);
  620.             }
  621.         }
  622.     }
  623.  
  624.     static void Main(string[] args)
  625.     {
  626.         int[,] G = {
  627.         {  1, 0, 0, 3, 0, 0, 7  },
  628.         {  0, 0, 2, 0, 4, 0, 1  },
  629.         {  0, 2, 0, 4, 1, 2, 3  },
  630.         {  3, 0, 4, 0, 5, 3, 3  },
  631.         {  0, 4, 1, 5, 0, 1, 2  },
  632.         {  0, 0, 2, 3, 1, 0, 2  },
  633.         {  7, 1, 3, 3, 2, 2, 0  }
  634.         };
  635.  
  636.         DFS(G, 4);
  637.         Console.WriteLine();
  638.         visited = new bool[G.GetLength(0)];
  639.         DFSRekurencja(G,4);
  640.         Console.ReadKey();
  641.  
  642.     }
  643. }
  644.  
  645. using System;
  646. using System.Collections.Generic;
  647. using System.Linq;
  648. using System.Text;
  649. using System.Threading.Tasks;
  650.  
  651. //B)
  652. // WESJA WSZERZ
  653. // NA MACIERZY SASIEDZTWA
  654.  
  655. //| 1 0 0 3 0 0 7 |
  656. //| 0 0 2 0 4 0 1 |
  657. //| 0 2 0 4 1 2 3 |
  658. //| 3 0 4 0 5 3 3 |
  659. //| 0 4 1 5 0 1 2 |
  660. //| 0 0 2 3 1 0 2 |
  661. //| 7 1 3 3 2 2 0 |
  662.  
  663. //Narysuj graf G(w B wartości oznaczają wagi a nie liczbę krawędzi).
  664. //Napisz metodę przechodzenia grafu w WsZERZ i zastosuj dla grafu G
  665.  
  666. class Program
  667. {
  668.     static void BFS(int[,] G, int v)
  669.     {
  670.         Queue<int> kolejka = new Queue<int>();
  671.         bool[] odwiedzony = new bool[G.GetLength(0)];
  672.         kolejka.Enqueue(v);
  673.         while (kolejka.Count > 0)
  674.         {
  675.             v = kolejka.Dequeue();
  676.             if (!odwiedzony[v])
  677.             {
  678.                 Console.WriteLine(v);
  679.                 odwiedzony[v] = true;
  680.                 // do kolejki mogą być włożone powtórnie te które już są
  681.                 for (int i = 0; i < G.GetLength(0); i++)
  682.                 {
  683.                     if (G[v, i] != 0 && !odwiedzony[i])
  684.                     {
  685.                         kolejka.Enqueue(i);
  686.                     }
  687.                 }
  688.             }
  689.         }
  690.     }
  691.  
  692.     // TERAZ TYLKO RAZ JEST WKLADANY DO KOLEJKI
  693.     //
  694.     // gdyby tak zrobic dla DFS i wkładać na stos tylko niewłożone
  695.     // to wynik byłby inny a dla kolejki wynik jest taki sam jak wyżej
  696.  
  697.     static void BFS1(int[,] G, int v)
  698.     {
  699.         Queue<int> kolejka = new Queue<int>();
  700.         bool[] wlozony = new bool[G.GetLength(0)];
  701.         kolejka.Enqueue(v);
  702.         wlozony[v] = true;
  703.  
  704.         while (kolejka.Count > 0)
  705.         {
  706.             v = kolejka.Dequeue();
  707.             Console.WriteLine(v);
  708.  
  709.             for (int i = 0; i < G.GetLength(0); i++)
  710.             {
  711.                 // jak włożony to drugi raz nie włożymy
  712.                 if (G[v, i] != 0 && !wlozony[i])
  713.                 {
  714.                     kolejka.Enqueue(i);
  715.                     wlozony[i] = true;
  716.                 }
  717.             }
  718.         }
  719.     }
  720.  
  721.     static void Main(string[] args)
  722.     {
  723.         int[,] G =
  724.         {
  725.             {  1, 0, 0, 3, 0, 0, 7  },
  726.             {  0, 0, 2, 0, 4, 0, 1  },
  727.             {  0, 2, 0, 4, 1, 2, 3  },
  728.             {  3, 0, 4, 0, 5, 3, 3  },
  729.             {  0, 4, 1, 5, 0, 1, 2  },
  730.             {  0, 0, 2, 3, 1, 0, 2  },
  731.             {  7, 1, 3, 3, 2, 2, 0  }
  732.         };
  733.         BFS(G, 4);
  734.         Console.WriteLine();
  735.         BFS1(G, 4);
  736.         Console.WriteLine();
  737.  
  738.         Console.ReadKey();
  739.  
  740.     }
  741. }
  742.  
  743. using System;
  744. using System.Collections.Generic;
  745. using System.Linq;
  746. using System.Text;
  747. using System.Threading.Tasks;
  748.  
  749. //Zadanie 3
  750. //    Zaimplementuj graf z zadania 2 B jako listy sąsiedztwa.
  751. //    Napisz dla takiej reprezentacji metodę przechodzenia grafu w głąb.
  752. class Krawedz
  753. {
  754.    public int wierzcholek;
  755.    public int waga;
  756.     public Krawedz(int v, int w)
  757.     {
  758.         wierzcholek = v;
  759.         waga = w;
  760.     }
  761. }
  762.  
  763. class Program
  764. {
  765.     static List<List<Krawedz>> KonwertujNaListę(int[,] G)
  766.     {
  767.         List<List<Krawedz>> graf = new List<List<Krawedz>>();
  768.         for (int i = 0; i < G.GetLength(0); i++)
  769.         {
  770.             graf.Add(new List<Krawedz>());
  771.             for (int j = 0; j < G.GetLength(1); j++)
  772.                 if (G[i, j] != 0) graf[i].Add(new Krawedz(j, G[i,j]));
  773.         }
  774.         return graf;
  775.     }
  776.  
  777.     // wypisuję tylko kolejne wierzchołki na ekran
  778.     static void DFS(List<List<Krawedz>> graf, int s)
  779.     {
  780.         int[] wizyty = new int[graf.Count];
  781.         Stack<int> stos = new Stack<int>();
  782.         stos.Push(s);
  783.         while(stos.Count>0)
  784.         {
  785.             int v = stos.Pop();
  786.             if(wizyty[v] == 0)
  787.             {
  788.                 Console.WriteLine(v);
  789.                 wizyty[v] = 1;
  790.                 for(int i =0;i<graf[v].Count;i++)
  791.                 {
  792.                     if(wizyty[graf[v][graf[v].Count - i - 1].wierzcholek] == 0)
  793.                     {
  794.                         stos.Push(graf[v][graf[v].Count - i - 1].wierzcholek);
  795.                     }                  
  796.                 }
  797.             }
  798.         }
  799.     }
  800.  
  801.     static void Main(string[] args)
  802.     {
  803.         int[,] G = {
  804.         { 1, 0, 0, 3, 0, 0, 7 },
  805.         { 0, 0, 2, 0, 4, 0, 1 },
  806.         { 0, 2, 0, 4, 1, 2, 3 },
  807.         { 3, 0, 4, 0, 5, 3, 3 },
  808.         { 0, 4, 1, 5, 0, 1, 2 },
  809.         { 0, 0, 2, 3, 1, 0, 2 },
  810.         { 7, 1, 3, 3, 2, 2, 0 }
  811.         };
  812.  
  813.         List<List<Krawedz>> graf = KonwertujNaListę(G);
  814.         DFS(graf, 0);
  815.         Console.ReadKey();
  816.     }
  817. }
  818.  
  819. using System;
  820. using System.Collections.Generic;
  821. using System.Linq;
  822. using System.Text;
  823. using System.Threading.Tasks;
  824.  
  825. class Krawedz
  826. {
  827.     public int wierzcholek;
  828.     public int waga;
  829.     public Krawedz(int v, int w)
  830.     {
  831.         wierzcholek = v;
  832.         waga = w;
  833.     }
  834. }
  835. //Zadanie 4
  836. //Zaimplementuj algorytm Dijkstry zgodnie z pseudokodem podanym na wykładzie.
  837. //    Dla grafów z zadania 2 wypisz krok po kroku realizację algorytmu Dijkstry,
  838. //    wybierając jako startowy wierzchołek pierwszy(w przypadku B ten z krawędzią cykliczną).
  839.     class Program
  840.     {
  841.     static List<Krawedz>[] KonwersjaNaListy(int[,] G)
  842.     {
  843.         List<Krawedz>[] graf = new List<Krawedz>[G.GetLength(0)];
  844.         for (int i = 0; i < graf.Length; i++)
  845.         {
  846.             graf[i] = new List<Krawedz>();
  847.             for (int j = 0; j < G.GetLength(0); j++)
  848.                 if (G[i, j] != 0) graf[i].Add(new Krawedz(j, G[i,j]));
  849.         }
  850.         return graf;
  851.     }
  852.        
  853.     // NA LISTACH SASIEDZTWA
  854.  
  855.     static void Dijkstra(List<Krawedz>[] graf, int v)
  856.     {
  857.         int[] poprzednik = new int[graf.Length];
  858.         bool[] policzony = new bool[graf.Length];
  859.         int[] wagi = new int[graf.Length];
  860.         for (int i = 0; i < wagi.Length; i++)
  861.         {
  862.             wagi[i] = int.MaxValue/2;
  863.             poprzednik[i] = - 1;
  864.         }
  865.         wagi[v] = 0;
  866.         policzony[v] = true;
  867.         for (int i = 0; i < graf[v].Count; i++)
  868.         {
  869.             if (!policzony[graf[v][i].wierzcholek])
  870.             {
  871.                 wagi[graf[v][i].wierzcholek] = graf[v][i].waga;
  872.                 poprzednik[graf[v][i].wierzcholek] = v;
  873.             }
  874.         }
  875.  
  876.  
  877.         for (int i = 1; i < graf.Length; i++)
  878.         {
  879.             int min = int.MaxValue;
  880.             int minInd = -1;
  881.             for (int j = 0; j < wagi.Length; j++)
  882.             {
  883.                 if (wagi[j]<min && !policzony[j])
  884.                 {
  885.                     min = wagi[j];
  886.                     minInd = j;
  887.                 }
  888.             }
  889.             policzony[minInd] = true;
  890.             for (int j = 0; j < graf[minInd].Count; j++)
  891.             {
  892.                 if (wagi[minInd]+graf[minInd][j].waga<wagi[graf[minInd][j].wierzcholek])
  893.                 {
  894.                     if (!policzony[graf[minInd][j].wierzcholek])
  895.                     {
  896.                         wagi[graf[minInd][j].wierzcholek] = wagi[minInd] + graf[minInd][j].waga;
  897.                         poprzednik[graf[minInd][j].wierzcholek] = minInd;
  898.                     }
  899.                 }
  900.             }
  901.            
  902.         }
  903.         for (int i = 0; i<wagi.Length;i++)
  904.         {
  905.             Console.WriteLine(wagi[i] + "  " + poprzednik[i]);
  906.         }
  907.     }
  908.  
  909.     static void Main(string[] args)
  910.         {
  911.         int[,] G = {
  912.         {  1, 0, 0, 3, 0, 0, 7  },
  913.         {  0, 0, 2, 0, 4, 0, 1  },
  914.         {  0, 2, 0, 4, 1, 2, 3  },
  915.         {  3, 0, 4, 0, 5, 3, 3  },
  916.         {  0, 4, 1, 5, 0, 1, 2  },
  917.         {  0, 0, 2, 3, 1, 0, 2  },
  918.         {  7, 1, 3, 3, 2, 2, 0  }
  919.         };
  920.  
  921.         List<Krawedz>[] graf = KonwersjaNaListy(G);
  922.         Dijkstra(graf, 0);
  923.         Console.ReadKey();
  924.     }
  925.     }
  926.  
  927. using System;
  928. using System.Collections.Generic;
  929. using System.Linq;
  930. using System.Text;
  931. using System.Threading.Tasks;
  932.  
  933. // WERSJA NA MACIERZY SASIEDZTWA
  934. // Ale zbory L i R jako listy a to poglądowo wygląda dobrze
  935. // ale złożoność niepotrzebnie rośnie
  936.  
  937. //Zadanie 4
  938. //    Zaimplementuj algorytm Dijkstry zgodnie z pseudokodem podanym na wykładzie.
  939. //    Dla grafów z zadania 2 wypisz krok po kroku realizację algorytmu Dijkstry,
  940. //    wybierając jako startowy wierzchołek pierwszy(w przypadku B ten z krawędzią cykliczną).
  941.  
  942. class Program
  943. {
  944.     static void Dijkstra(int[,] G, int s)
  945.     {
  946.         List<int> L = new List<int>();// to niezbyt dobry pomysł bo złożoność rośnie
  947.         List<int> R = new List<int>();// j.w.
  948.  
  949.         int[] w = new int[G.GetLength(0)];
  950.         w[s] = 0;
  951.         L.Add(s);
  952.         for (int i = 0; i < w.Length; i++)
  953.         {
  954.             if (i != s)
  955.             {
  956.                 R.Add(i);
  957.                 if (G[s, i] == 0)
  958.                 {
  959.                     w[i] = int.MaxValue / 2;
  960.                 }
  961.                 else
  962.                 {
  963.                     w[i] = G[s, i];
  964.                 }
  965.             }
  966.         }
  967.  
  968.         for (int i = 1; i < w.Length; i++)
  969.         {
  970.             int min = int.MaxValue;
  971.             int minInd = -1;
  972.             for (int k = 0; k < w.Length; k++)
  973.             {
  974.                 if (R.Contains(k)) // to niezbyt dobry pomysł bo złożoność rośnie
  975.                 {
  976.                     if (w[k] < min)
  977.                     {
  978.                         min = w[k];
  979.                         minInd = k;
  980.                     }
  981.                 }
  982.             }
  983.             L.Add(minInd);
  984.             R.Remove(minInd); // to niezbyt dobry pomysł bo złożoność rośnie
  985.  
  986.             for (int j = 0; j < G.GetLength(0); j++)
  987.             {
  988.                 if (G[minInd, j] != 0 && R.Contains(j))
  989.                 {
  990.                     if (w[minInd] + G[minInd, j] < w[j])
  991.                     {
  992.                         w[j] = w[minInd] + G[minInd, j];
  993.                     }
  994.                 }
  995.             }
  996.         }
  997.         for (int i = 0; i < w.Length; i++)
  998.         {
  999.             Console.WriteLine(w[i]);
  1000.         }
  1001.     }
  1002.  
  1003.     static void Main(string[] args)
  1004.     {
  1005.         int[,] G = {
  1006.         { 1, 0, 0, 3, 0, 0, 7 },
  1007.         { 0, 0, 2, 0, 4, 0, 1 },
  1008.         { 0, 2, 0, 4, 1, 2, 3 },
  1009.         { 3, 0, 4, 0, 5, 3, 3 },
  1010.         { 0, 4, 1, 5, 0, 1, 2 },
  1011.         { 0, 0, 2, 3, 1, 0, 2 },
  1012.         { 7, 1, 3, 3, 2, 2, 0 }
  1013.         };
  1014.  
  1015.  
  1016.         Dijkstra(G, 0);
  1017.  
  1018.         Console.ReadKey();
  1019.     }
  1020. }
  1021.  
  1022. //Przykładowy kolos
  1023.  
  1024. using System;
  1025. using System.CodeDom;
  1026. using System.Collections.Generic;
  1027. using System.Diagnostics;
  1028. using System.Runtime.CompilerServices;
  1029. using System.Text;
  1030. using System.Threading;
  1031. using System.Threading.Tasks;
  1032.  
  1033. namespace AISD_Kolos2_Moodle
  1034. {
  1035.     class Program
  1036.     {
  1037.         static void Main(string[] args)
  1038.         {
  1039.             //Zadanie1(); Chcemy reprezentować wielomiany w postaci listy jednokierunkowej par
  1040.             //(współczynnik; wykładnik). Uwaga: przechowujemy tylko współczynniki niezerowe.
  1041.             //Napisz zestaw metod do tworzenia takich wielomianów na podstawie tablicy, a także
  1042.             //dodawania i odejmowania takich wielomianów oraz różniczkowania
  1043.  
  1044.             //Zadanie2();Opracuj strukturę danych Zbiór opartą na liście dowiązaniowej. Napisz metodę Suma
  1045.             //(mnogościowa)tworzącą listę z elementów dwóch list Napisz także metodę Iloczyn
  1046.             //(mnogościowy) tworzącą listę z elementów wspólnych(o takiej samej wartości
  1047.             //klucza) z dwóch list.Dodaj metodę Różnica(mnogościowa).Rozważ dwa przypadki
  1048.             //listy nieuporządkowane i uporządkowane. Jaka jest złożoność opracowanych
  1049.             //algorytmów(metod) ?
  1050.  
  1051.             //Zadanie3();Napisz metodę (iteracyjną), która za pomocą kolejki wypisuje zawartość drzewa
  1052.             //kolejnymi poziomami.
  1053.  
  1054.             //Zadanie4();Drzewo BST odczytano w porządku pre-order i otrzymano 6, 3, 1, 2, 4, 5, 7. Czy
  1055.             //możemy odtworzyć to drzewo? Napisz metodę odtwarzającą drzewo na podstawie
  1056.             //odczytu pre-order, jeżeli drzewa nie można odtworzyć(dane są sprzeczne np. 6, 3,
  1057.             //1, 2, 4, 7, 5) metoda ma zwracać drzewo puste.
  1058.  
  1059.             //Zadanie5();Napisz metodę, która dla spójnego grafu nieskierowanego, dla którego dane są
  1060.             //liczbowe wagi krawędzi, znajduje drzewo rozpinające o maksymalnej wartości.
  1061.  
  1062.             Console.ReadKey();
  1063.         }
  1064.  
  1065.         static void Zadanie5()
  1066.         {
  1067.             int n = 7;
  1068.             List<List<int>> graph = new List<List<int>>
  1069.             {
  1070.                 new List<int>(){0, 0, 0, 0, 0, 0, 0},
  1071.                 new List<int>(){0, 0, 5, 0, 0, 10, 0},
  1072.                 new List<int>(){0, 5, 0, 7, 0, 4, 0},
  1073.                 new List<int>(){0, 0, 7, 0, 4, 0, 0},
  1074.                 new List<int>(){0, 0, 0, 3, 0, 2, 1},
  1075.                 new List<int>(){0, 10, 4, 0, 2, 0, 0},
  1076.                 new List<int>(){0, 0, 0, 0, 1, 0, 0}
  1077.             };
  1078.             bool[] visited = new bool[n];
  1079.  
  1080.             var drzewo = Prim(graph, 1, visited);
  1081.         }
  1082.  
  1083.         static List<List<int>> Prim(List<List<int>> graph, int s, bool[] visited)
  1084.         {
  1085.             List<List<int>> drzewo = new List<List<int>>();
  1086.             int root = s;
  1087.             visited[0] = true;
  1088.             visited[s] = true;
  1089.  
  1090.             List<Tuple<int, int>> l = new List<Tuple<int, int>>();
  1091.  
  1092.             bool allVisited = false;
  1093.  
  1094.             while (!allVisited)
  1095.             {
  1096.                 allVisited = true;
  1097.  
  1098.                 for (int i = 0; i < visited.Length; i++)
  1099.                 {
  1100.                     if (visited[i] == false)
  1101.                     {
  1102.                         allVisited = false;
  1103.                         break;
  1104.                     }
  1105.                 }
  1106.  
  1107.                 if (allVisited)
  1108.                     break;
  1109.  
  1110.                 for (int i = 0; i < graph[root].Count; i++)
  1111.                 {
  1112.                     if (graph[root][i] != 0 && !visited[i])
  1113.                         l.Add(new Tuple<int, int>(graph[root][i], i));
  1114.                 }
  1115.  
  1116.                 // sort list
  1117.                 l.Sort();
  1118.                 if (l.Count != 0)
  1119.                 {
  1120.                     drzewo.Add(new List<int>(){ root, l[0].Item2 });
  1121.                     root = l[0].Item2;
  1122.                     visited[l[0].Item2] = true;
  1123.                     l.Clear();
  1124.                 }
  1125.                 else
  1126.                 {
  1127.                     for (int i = drzewo.Count - 1; i >= 0; i--)
  1128.                     {
  1129.                         if (drzewo[i][1] == root)
  1130.                         {
  1131.                             root = drzewo[i][0];
  1132.                             break;
  1133.                         }
  1134.                     }
  1135.                 }
  1136.             }
  1137.  
  1138.             return drzewo;
  1139.         }
  1140.  
  1141.         static List<List<int>> Solve(int s, int n, List<List<bool>> graph, bool[] visited)
  1142.         {
  1143.             List<List<int>> drzewo = new List<List<int>>();
  1144.  
  1145.             Queue<int> q = new Queue<int>();
  1146.             q.Enqueue(s);
  1147.             visited[s] = true;
  1148.  
  1149.             while (q.Count != 0)
  1150.             {
  1151.                 int node = q.Dequeue();
  1152.                 var neighbours = graph[node];
  1153.                 for (int i = 0; i < neighbours.Count; i++)
  1154.                 {
  1155.                     if (neighbours[i] && !visited[i])
  1156.                     {
  1157.                         drzewo.Add(new List<int>() { node, i });
  1158.                         q.Enqueue(i);
  1159.                         visited[i] = true;
  1160.                     }
  1161.                 }
  1162.             }
  1163.  
  1164.             return drzewo;
  1165.         }
  1166.  
  1167.         static void Zadanie4()
  1168.         {
  1169.             int[] t = new int[]{ 6, 3, 1, 2, 4, 7, 5 };
  1170.             Tree root = null;
  1171.  
  1172.             int i = 0;
  1173.             bool badTree = false;
  1174.  
  1175.             root = constructTree(t, ref i, Int32.MaxValue);
  1176.  
  1177.            // WypiszDrzewo(root);
  1178.         }
  1179.  
  1180.         static bool IsValid(int[] pre)
  1181.         {
  1182.             Stack<int> s = new Stack<int>();
  1183.             int? lowerBound = null;
  1184.  
  1185.             for (int i = 0; i < pre.Length; i++)
  1186.             {
  1187.                 if (lowerBound != null && pre[i] < lowerBound) return false;
  1188.                 while (s.Count != 0 && s.Peek() < pre[i]) lowerBound = s.Pop();
  1189.                 s.Push(pre[i]);
  1190.             }
  1191.  
  1192.             return true;
  1193.         }
  1194.  
  1195.         static Tree constructTree(int[] pre, ref int i, int high)
  1196.         {
  1197.             if (!IsValid(pre)) return null;
  1198.             else
  1199.             {
  1200.                 if (i >= pre.Length || pre[i] > high) return null;
  1201.  
  1202.                 Tree root = new Tree(pre[i++]);
  1203.                 root.left = constructTree(pre, ref i, root.val);
  1204.                 root.right = constructTree(pre, ref i, high);
  1205.                 return root;
  1206.             }
  1207.         }
  1208.  
  1209.         static void Zadanie3()
  1210.         {
  1211.             Tree t = new Tree(5);
  1212.             t.left = new Tree(3);
  1213.             t.right = new Tree(10);
  1214.            
  1215.             t.left.left = new Tree(1);
  1216.             t.left.right = new Tree(4);
  1217.             t.right.left = new Tree(8);
  1218.             t.right.right = new Tree(12);
  1219.  
  1220.             WypiszDrzewo(t);
  1221.  
  1222.         }
  1223.  
  1224.         static void WypiszDrzewo(Tree root)
  1225.         {
  1226.             if (root == null)
  1227.                 return;
  1228.  
  1229.             Queue<Tree> q = new Queue<Tree>();
  1230.             q.Enqueue(root);
  1231.  
  1232.             while (true)
  1233.             {
  1234.                 int nodeCount = q.Count;
  1235.                 if (nodeCount == 0)
  1236.                     break;
  1237.  
  1238.                 while (nodeCount > 0)
  1239.                 {
  1240.                     Tree node = q.Dequeue();
  1241.                     Console.Write(node.val + " ");
  1242.  
  1243.                     if (node.left != null)
  1244.                         q.Enqueue(node.left);
  1245.                     if (node.right != null)
  1246.                         q.Enqueue(node.right);
  1247.                     nodeCount--;
  1248.                 }
  1249.                 Console.WriteLine();
  1250.             }
  1251.         }
  1252.  
  1253.         class Tree
  1254.         {
  1255.             public int val;
  1256.             public Tree left;
  1257.             public Tree right;
  1258.  
  1259.             public Tree(int val)
  1260.             {
  1261.                 this.val = val;
  1262.             }
  1263.         }
  1264.  
  1265.  
  1266.         static void Zadanie2()
  1267.         {
  1268.             int[] t2 = new int[] { 0 };
  1269.             int[] t1 = new int[] { 2, 3 ,5};
  1270.  
  1271.             Zbior z1 = new Zbior(t1);
  1272.             Zbior z2 = new Zbior(t2);
  1273.  
  1274.             Zbior z3 = Zbior.Suma(z1, z2);
  1275.  
  1276.             Zbior z4 = Zbior.Iloczyn(z1, z2);
  1277.  
  1278.             Debugger.Break();
  1279.         }
  1280.  
  1281.         class Zbior
  1282.         {
  1283.             public int val;
  1284.             public Zbior next;
  1285.  
  1286.             public Zbior(int[] tab)
  1287.             {
  1288.                 Zbior current = this;
  1289.  
  1290.                 for (int i = 0; i < tab.Length; i++)
  1291.                 {
  1292.                     if (i == 0)
  1293.                         val = tab[i];
  1294.                        
  1295.                     else
  1296.                     {
  1297.                         current.next = new Zbior(tab[i]);
  1298.                         current = current.next;
  1299.                     }
  1300.                 }
  1301.             }
  1302.  
  1303.             public static Zbior Iloczyn(Zbior z1, Zbior z2)
  1304.             {
  1305.                 Zbior zOut = new Zbior(0);
  1306.                 Zbior zn = zOut;
  1307.  
  1308.                 Zbior z2Start = z2;
  1309.                 bool first = true;
  1310.  
  1311.                 while (z1 != null && z2 != null)
  1312.                 {
  1313.                     while (z2 != null)
  1314.                     {
  1315.                         if (z1.val == z2.val)
  1316.                         {
  1317.                             if (first)
  1318.                             {
  1319.                                 zn.val = z2.val;
  1320.                                 first = false;
  1321.                             }
  1322.                             else
  1323.                             {
  1324.                                 zn.next = new Zbior(0);
  1325.                                 zn = zn.next;
  1326.                                 zn.val = z2.val;
  1327.                             }
  1328.                            
  1329.                             break;
  1330.                         }
  1331.                         z2 = z2.next;
  1332.                     }
  1333.                     z2 = z2Start;
  1334.                    
  1335.                     z1 = z1.next;
  1336.                 }
  1337.  
  1338.                 zn = null;
  1339.  
  1340.                 return zOut;
  1341.             }
  1342.  
  1343.             public static Zbior Suma(Zbior z1, Zbior z2)
  1344.             {
  1345.                 Zbior zOut = z1;
  1346.                 Zbior zn = zOut;
  1347.  
  1348.                 bool repeated = false;
  1349.  
  1350.                 while (z2 != null)
  1351.                 {
  1352.                     zn = zOut;
  1353.                     repeated = false;
  1354.  
  1355.                     while (zn != null)
  1356.                     {
  1357.                         if (zn.val == z2.val)
  1358.                         {
  1359.                             repeated = true;
  1360.                             break;
  1361.                         }
  1362.                         zn = zn.next;
  1363.                     }
  1364.  
  1365.                     zn = zOut;
  1366.  
  1367.                     if (!repeated && zn != null)
  1368.                     {
  1369.                         while (zn.next != null)
  1370.                         {
  1371.                             zn = zn.next;
  1372.                         }
  1373.  
  1374.                         zn.next = new Zbior(z2.val);
  1375.                     }
  1376.                    
  1377.                     z2 = z2.next;
  1378.                 }
  1379.  
  1380.                 return zOut;
  1381.             }
  1382.  
  1383.             public Zbior(int val, Zbior next = null)
  1384.             {
  1385.                 this.val = val;
  1386.                 this.next = next;
  1387.             }
  1388.         }
  1389.  
  1390.  
  1391.         static void Zadanie1()
  1392.         {
  1393.             int[] t1 = new int[] { 1, 2,3, 4};
  1394.             int[] t2 = new int[] { 2, 3};
  1395.  
  1396.             Wielomian w1 = new Wielomian(t1);
  1397.             Wielomian w2 = new Wielomian(t2);
  1398.  
  1399.             Wielomian.Calka(ref w1);
  1400.             Debugger.Break();
  1401.  
  1402.             Wielomian wOut = w2 - w1;
  1403.         }
  1404.  
  1405.         class Wielomian
  1406.         {
  1407.             public int coef;
  1408.             public int exp;
  1409.             public Wielomian next;
  1410.  
  1411.             public bool first = false;
  1412.             public bool last = false;
  1413.             public int count = -1;
  1414.  
  1415.             public static void Calka(ref Wielomian root)
  1416.             {
  1417.                 if (root.next == null)
  1418.                 {
  1419.                     if (root.exp == 0)
  1420.                         root.coef = 0;
  1421.                     else
  1422.                     {
  1423.                         root.next = new Wielomian(root.coef * root.exp, root.exp - 1);
  1424.                     }
  1425.                 }
  1426.                 else
  1427.                 {
  1428.                     Calka(ref root.next);
  1429.                     root.next = new Wielomian(root.coef * root.exp, root.exp - 1, root.next.next);
  1430.                     root.coef = 0;
  1431.                 }
  1432.             }
  1433.  
  1434.             public static Wielomian operator -(Wielomian w1, Wielomian w2)
  1435.             {
  1436.                 Wielomian wOut = w1.exp >= w2.exp ? w1 : w2;
  1437.                 Wielomian wSmall = w1.exp >= w2.exp ? w2 : w1;
  1438.                 bool switched = w1.exp < w2.exp;
  1439.  
  1440.                 Wielomian wReturn = wOut;
  1441.  
  1442.                 while (wOut != null && wSmall != null)
  1443.                 {
  1444.                     if (wOut.exp == wSmall.exp)
  1445.                     {
  1446.                         wOut.coef -= wSmall.coef;
  1447.                         if (switched)
  1448.                             wOut.coef = -wOut.coef;
  1449.                         wOut = wOut.next;
  1450.                         wSmall = wSmall.next;
  1451.                     }
  1452.                     else if (wOut.exp > wSmall.exp)
  1453.                     {
  1454.                         if (switched)
  1455.                             wOut.coef = -wOut.coef;
  1456.                         wOut = wOut.next;
  1457.                     }
  1458.                 }
  1459.  
  1460.                 while (wSmall != null)
  1461.                 {
  1462.                     wOut.next = wSmall;
  1463.                     wOut = wOut.next;
  1464.                     if (switched)
  1465.                         wOut.coef = wOut.coef;
  1466.                     else
  1467.                         wOut.coef = -wOut.coef;
  1468.                     wSmall = wSmall.next;
  1469.                 }
  1470.  
  1471.                 return wReturn;
  1472.             }
  1473.  
  1474.             public static Wielomian operator +(Wielomian w1, Wielomian w2)
  1475.             {
  1476.                 Wielomian wOut = w1.exp >= w2.exp ? w1 : w2;
  1477.                 Wielomian wSmall = w1.exp >= w2.exp ? w2 : w1;
  1478.  
  1479.                 Wielomian wReturn = wOut;
  1480.  
  1481.                 while (wOut != null && wSmall != null)
  1482.                 {
  1483.                     if (wOut.exp == wSmall.exp)
  1484.                     {
  1485.                         wOut.coef += wSmall.coef;
  1486.                         wOut = wOut.next;
  1487.                         wSmall = wSmall.next;
  1488.                     }
  1489.                     else if (wOut.exp > wSmall.exp)
  1490.                         wOut = wOut.next;
  1491.                 }
  1492.  
  1493.                 while (wSmall != null)
  1494.                 {
  1495.                     wOut.next = wSmall;
  1496.                     wOut = wOut.next;
  1497.                     wSmall = wSmall.next;
  1498.                 }
  1499.  
  1500.                 return wReturn;
  1501.             }
  1502.  
  1503.             public Wielomian(int coef, int exp, Wielomian next = null)
  1504.             {
  1505.                 this.coef = coef;
  1506.                 this.exp = exp;
  1507.                 this.next = next;
  1508.             }
  1509.  
  1510.             public Wielomian(int[] tab)
  1511.             {
  1512.                 Wielomian current = this;
  1513.                 first = true;
  1514.                 count = tab.Length;
  1515.  
  1516.                 for (int i = tab.Length - 1; i >= 0; i--)
  1517.                 {
  1518.                     if (tab[i] != 0)
  1519.                     {
  1520.                         if (i == tab.Length - 1)
  1521.                         {
  1522.                             coef = tab[i];
  1523.                             exp = i;
  1524.                         }
  1525.                         else
  1526.                         {
  1527.                             current.next = new Wielomian(tab[i], i);
  1528.                             current = current.next;
  1529.                             if (i == 0)
  1530.                                 current.last = true;
  1531.                         }
  1532.                     }
  1533.                    
  1534.                 }
  1535.             }
  1536.  
  1537.         }
  1538.  
  1539.  
  1540.         //static void Pociag()
  1541.         //{
  1542.         //    string pociag = "             .---._\r\n           .--(. '  .).--.      . .-.\r\n        . ( ' _) .)` (   .)-. ( ) '-'\r\n       ( ,  ).        `(' . _)\r\n     (')  _________      '-'\r\n     ____[_________]                                         ________\r\n     \\__/ | _ \\  ||    ,;,;,,                               [________]\r\n     _][__|(\")/__||  ,;;;;;;;;,   __________   __________   _| LILI |_\r\n    /             | |____      | |          | |  ___     | |      ____|\r\n   (| .--.    .--.| |     ___  | |   |  |   | |      ____| |____      |\r\n   /|/ .. \\~~/ .. \\_|_.-.__.-._|_|_.-:__:-._|_|_.-.__.-._|_|_.-.__.-._|\r\n+=/_|\\ '' /~~\\ '' /=+( o )( o )+==( o )( o )=+=( o )( o )+==( o )( o )=+=";
  1543.         //    List<char> znaki = new List<char>(pociag.Length);
  1544.  
  1545.         //    bool nl = true;
  1546.         //    for (int i = 0; i < pociag.Length; i++)
  1547.         //    {
  1548.         //        if (nl)
  1549.         //        {
  1550.         //            for (int j = 0; j < 15; j++)
  1551.         //            {
  1552.         //                znaki.Add('\t');
  1553.         //            }
  1554.  
  1555.         //            nl = false;
  1556.         //        }
  1557.  
  1558.         //        if (pociag[i] == '\n')
  1559.         //        {
  1560.         //            nl = true;
  1561.         //        }
  1562.  
  1563.         //        znaki.Add(pociag[i]);
  1564.         //    }
  1565.  
  1566.         //    int tabs = 15;
  1567.         //    int index = -15;
  1568.         //    nl = true;
  1569.  
  1570.         //    while (true)
  1571.         //    {
  1572.         //        nl = true;
  1573.         //        index = -tabs;
  1574.         //        StringBuilder s = new StringBuilder();
  1575.         //        foreach (var znak in znaki)
  1576.         //        {
  1577.         //            s.Append(znak);
  1578.         //        }
  1579.  
  1580.         //        Console.Clear();
  1581.         //        Console.Write(s);
  1582.  
  1583.         //        if (index >= -1)
  1584.         //        {
  1585.         //            for (int i = 0; i < znaki.Count; i++)
  1586.         //            {
  1587.         //                if (nl)
  1588.         //                {
  1589.         //                    znaki.RemoveRange(i + 1, 4);
  1590.         //                    nl = false;
  1591.         //                }
  1592.  
  1593.         //                if (znaki[i] == '\n')
  1594.         //                {
  1595.         //                    nl = true;
  1596.         //                }
  1597.         //            }
  1598.         //        }
  1599.  
  1600.         //        while (index != -1)
  1601.         //        {
  1602.         //            index = znaki.IndexOf('\t', index + tabs);
  1603.         //            if (index != -1)
  1604.         //                znaki.RemoveAt(index);
  1605.         //        }
  1606.  
  1607.         //        tabs--;
  1608.  
  1609.         //        Thread.Sleep(30);
  1610.         //    }
  1611.  
  1612.  
  1613.  
  1614.  
  1615.         //    //Debugger.Break();
  1616.         //}
  1617.     }
  1618. }
  1619.  
  1620.  
  1621. //DRZEWA BST
  1622.  
  1623. using System;
  1624. //narysuj drzewo bst wstawiające kolejno
  1625. class Drzewo
  1626. {
  1627.     public Węzeł korzeń;
  1628. }
  1629. class Węzeł
  1630. {
  1631.     public int wartość; // tutaj klucz
  1632.     public Węzeł lewy;
  1633.     public Węzeł prawy;
  1634. }
  1635.  
  1636. class Program
  1637. {
  1638.     static void Wstaw(Drzewo d, int k)
  1639.     {
  1640.         Węzeł nowy = new Węzeł();
  1641.         nowy.wartość = k;
  1642.         if (d.korzeń == null)
  1643.         {
  1644.             d.korzeń = nowy;
  1645.         }
  1646.         else
  1647.             WstawRekurencyjnie(d.korzeń, nowy);
  1648.     }
  1649.     static void WstawRekurencyjnie(Węzeł w, Węzeł nowy)
  1650.     {
  1651.         if (w.wartość > nowy.wartość)
  1652.         {
  1653.             if (w.lewy == null) w.lewy = nowy;
  1654.             else
  1655.                 WstawRekurencyjnie(w.lewy, nowy);
  1656.         }
  1657.         else
  1658.         {
  1659.             if (w.prawy == null) w.prawy = nowy;
  1660.             else WstawRekurencyjnie(w.prawy, nowy);
  1661.         }
  1662.     }
  1663.     static void PreOrder(Węzeł w)
  1664.     {
  1665.         if (w != null)
  1666.         {
  1667.             Console.Write(w.wartość + " ");
  1668.             PreOrder(w.lewy);
  1669.             PreOrder(w.prawy);
  1670.         }
  1671.     }
  1672.  
  1673.     static void WyswietlDrzewo(Węzeł w, string wciecie)
  1674.     {
  1675.         if (w != null)
  1676.         {
  1677.             if (w.prawy == null && w.lewy != null) Console.WriteLine(wciecie + "   *");
  1678.             else WyswietlDrzewo(w.prawy, wciecie + "   ");
  1679.             Console.WriteLine(wciecie + w.wartość);
  1680.             if (w.lewy == null && w.prawy != null) Console.WriteLine(wciecie + "   *");
  1681.             else WyswietlDrzewo(w.lewy, wciecie + "   ");
  1682.         }
  1683.     }
  1684.  
  1685. //    Zadanie 2
  1686. //      Mamy zadany zbiór kluczy: {10, 16, 12, 7, 9, 2, 21, 6, 17, 1, 15}.
  1687. //      Należy skonstruować drzewo BST biorąc klucze w kolejności:
  1688. //      a) podanej
  1689. //      b) odwrotnej
  1690. //      c) na przemian od początku do końca
  1691. //      d) na przemian od końca do początku
  1692.     static void Main(string[] args)
  1693.     {
  1694.         int[] t = { 10, 16, 12, 7, 9, 2, 21, 6, 17, 1, 15 };
  1695.         Drzewo d = new Drzewo();
  1696.         for (int i = 0; i < t.Length; i++)
  1697.         {
  1698.             Wstaw(d, t[i]);
  1699.         }
  1700.         PreOrder(d.korzeń);
  1701.         Console.WriteLine();
  1702.         Console.WriteLine();
  1703.         WyswietlDrzewo(d.korzeń, "");
  1704.         Console.WriteLine();
  1705.         Drzewo d1 = new Drzewo();
  1706.         for (int i = 0; i < t.Length; i++)
  1707.         {
  1708.             Wstaw(d1, t[t.Length-i-1]);
  1709.         }
  1710.         PreOrder(d1.korzeń);
  1711.         Console.WriteLine();
  1712.         Console.WriteLine();
  1713.         WyswietlDrzewo(d1.korzeń, "");
  1714.         Console.WriteLine();
  1715.         Drzewo d2 = new Drzewo();
  1716.         for (int i = 0; i < t.Length/2; i++)
  1717.         {
  1718.             Wstaw(d2, t[i]);
  1719.             Wstaw(d2, t[t.Length - 1 - i]);
  1720.         }
  1721.         if (t.Length % 2 != 0) Wstaw(d2, t.Length / 2);
  1722.         PreOrder(d2.korzeń);
  1723.         Console.WriteLine();
  1724.         Console.WriteLine();
  1725.         WyswietlDrzewo(d2.korzeń, "");
  1726.         Console.WriteLine();
  1727.         Drzewo d3 = new Drzewo();
  1728.         for (int i = 0; i < t.Length / 2; i++)
  1729.         {
  1730.             Wstaw(d3, t[t.Length - 1 - i]);
  1731.             Wstaw(d3, t[i]);  
  1732.         }
  1733.         if (t.Length % 2 != 0) Wstaw(d3, t.Length / 2);
  1734.         PreOrder(d3.korzeń);
  1735.         Console.WriteLine();
  1736.         Console.WriteLine();
  1737.         WyswietlDrzewo(d3.korzeń, "");
  1738.         Console.WriteLine();
  1739.  
  1740.  
  1741.         Console.ReadKey();
  1742.     }
  1743. }
  1744.  
  1745. //    Zadanie 3
  1746.     //Proszę narysować drzewa BST o wysokości 2, 3, 4, 5 oraz 6 (zygzakiem)
  1747.     //zawierające następujący zbiór kluczy: {2, 4, 7, 12, 15, 20, 25}.
  1748.  
  1749.     // Następnie proszę przejść te drzewa w porządku in-order wypisując kolejne węzły.
  1750.     static void InOrder(Węzeł w)
  1751.     {
  1752.         if (w != null)
  1753.         {
  1754.             InOrder(w.lewy);
  1755.             Console.Write(w.wartość + " ");
  1756.             InOrder(w.prawy);
  1757.         }
  1758.     }
  1759.  
  1760.     static void Main(string[] args)
  1761.     {
  1762.         int[] t = { 2, 4, 7, 12, 15, 20, 25 };
  1763.         Drzewo d = new Drzewo();
  1764.         for (int i = 0; i < t.Length; i++)
  1765.         {
  1766.             Wstaw(d, t[i]);
  1767.         }
  1768.         PreOrder(d.korzeń);
  1769.         Console.WriteLine();
  1770.         InOrder(d.korzeń);
  1771.         Console.WriteLine();
  1772.         Console.WriteLine();
  1773.         WyswietlDrzewo(d.korzeń, ""); // wysokosc 6
  1774.         Console.WriteLine("------------------------------------------------");
  1775.  
  1776.         int[] t1 = { 12, 4, 2, 7, 20, 15, 25 };
  1777.         Drzewo d1 = new Drzewo();
  1778.         for (int i = 0; i < t1.Length; i++)
  1779.         {
  1780.             Wstaw(d1, t1[i]);
  1781.         }
  1782.         PreOrder(d1.korzeń);
  1783.         Console.WriteLine();
  1784.         InOrder(d1.korzeń);
  1785.         Console.WriteLine();
  1786.         Console.WriteLine();
  1787.         WyswietlDrzewo(d1.korzeń, ""); // wysokosc 2
  1788.         Console.WriteLine("------------------------------------------------");
  1789.  
  1790.         int[] t2 = { 12, 2, 4, 7, 20, 15, 25 };
  1791.         Drzewo d2 = new Drzewo();
  1792.         for (int i = 0; i < t2.Length; i++)
  1793.         {
  1794.             Wstaw(d2, t2[i]);
  1795.         }
  1796.         PreOrder(d2.korzeń);
  1797.         Console.WriteLine();
  1798.         InOrder(d2.korzeń);
  1799.         Console.WriteLine();
  1800.         Console.WriteLine();
  1801.         WyswietlDrzewo(d2.korzeń, ""); // wysokosc 3
  1802.         Console.WriteLine("------------------------------------------------");
  1803.  
  1804.         int[] t3 = { 15, 12, 2, 4, 7, 20, 25 };
  1805.         Drzewo d3 = new Drzewo();
  1806.         for (int i = 0; i < t3.Length; i++)
  1807.         {
  1808.             Wstaw(d3, t3[i]);
  1809.         }
  1810.         PreOrder(d3.korzeń);
  1811.         Console.WriteLine();
  1812.         InOrder(d3.korzeń);
  1813.         Console.WriteLine();
  1814.         Console.WriteLine();
  1815.         WyswietlDrzewo(d3.korzeń, ""); // wysokosc 4
  1816.         Console.WriteLine("------------------------------------------------");
  1817.  
  1818.         int[] t4 = { 2, 25, 4, 20, 7, 15, 12 };
  1819.         Drzewo d4 = new Drzewo();
  1820.         for (int i = 0; i < t4.Length; i++)
  1821.         {
  1822.             Wstaw(d4, t4[i]);
  1823.         }
  1824.         PreOrder(d4.korzeń);
  1825.         Console.WriteLine();
  1826.         InOrder(d4.korzeń);
  1827.         Console.WriteLine();
  1828.         Console.WriteLine();
  1829.         WyswietlDrzewo(d4.korzeń, ""); // wysokosc 6 zygzak
  1830.  
  1831.         Console.ReadKey();
  1832.     }
  1833.  
  1834. // Zadanie 5
  1835.     // Napisz w C# metody znajdujące w drzewie BST węzeł z maksymalnym kluczem,
  1836.     // oraz węzeł z minimalnym kluczem.
  1837.  
  1838.  
  1839.     // iteracja, można rekurencyjnie jak dla Min
  1840.     static Węzeł Max(Węzeł w)
  1841.     {
  1842.         Węzeł temp = w;
  1843.         while (temp.prawy != null)
  1844.         {
  1845.             temp = temp.prawy;
  1846.         }
  1847.         return temp;
  1848.     }
  1849.     // rekurencja, można iteracyjnie jak dla Min
  1850.     static Węzeł Min(Węzeł w)
  1851.     {
  1852.         if (w.lewy == null)
  1853.         {
  1854.             return w;
  1855.         }
  1856.         else
  1857.             return Min(w.lewy);
  1858.     }
  1859.  
  1860.     //  Napisz w C# metodę iteracyjną wyszukującą węzeł o podanej wartości klucza.
  1861.     // iteracja
  1862.     static Węzeł ZnajdzPoKluczu(Węzeł w,int k)
  1863.     {
  1864.         Węzeł temp = w;
  1865.         while (temp != null)
  1866.         {
  1867.             if (temp.wartość == k) return temp;
  1868.             if(temp.wartość<k)
  1869.                     temp = temp.prawy;
  1870.             else
  1871.                 temp = temp.lewy;
  1872.         }
  1873.         return temp;
  1874.     }
  1875.    
  1876.    
  1877.  
  1878.     static void Main(string[] args)
  1879.     {
  1880.         int[] t = { 10, 16, 12, 7, 9, 2, 21, 6, 17, 1, 15 };
  1881.         Drzewo d = new Drzewo();
  1882.         for (int i = 0; i < t.Length; i++)
  1883.         {
  1884.             Wstaw(d, t[i]);
  1885.         }
  1886.         PreOrder(d.korzeń);
  1887.         Console.WriteLine();
  1888.         Console.WriteLine();
  1889.         WyswietlDrzewo(d.korzeń, "");
  1890.         Console.WriteLine();
  1891.  
  1892.         Węzeł W = Max(d.korzeń);
  1893.         Console.WriteLine(W.wartość);
  1894.         W = Min(d.korzeń);
  1895.         Console.WriteLine(W.wartość);
  1896.  
  1897.         W = ZnajdzPoKluczu(d.korzeń, 17);
  1898.         if (W != null)
  1899.             Console.WriteLine("znaleziono "+W.wartość);
  1900.         else Console.WriteLine("nie znaleziono");
  1901.         W = ZnajdzPoKluczu(d.korzeń, 77);
  1902.         if (W != null)
  1903.             Console.WriteLine("znaleziono " + W.wartość);
  1904.         else Console.WriteLine("nie znaleziono");
  1905.  
  1906.         Console.ReadKey();
  1907.     }
  1908. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement