Advertisement
Guest User

Untitled

a guest
Jan 24th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.74 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Kolokwium
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             Graph graf = new Graph();
  14.             Node Wezel1 = new Node("a");
  15.             Node Wezel2 = new Node("b");
  16.             Node Wezel3 = new Node("c");
  17.             Node Wezel4 = new Node("d");
  18.             Node Wezel5 = new Node("e");
  19.             Node Wezel6 = new Node("f");
  20.             Node Wezel7 = new Node("g");
  21.             Krawedz edge1 = new Krawedz(Wezel1, Wezel2, 7);
  22.             Krawedz edge2 = new Krawedz(Wezel1, Wezel4, 5);
  23.             Krawedz edge3 = new Krawedz(Wezel2, Wezel3, 8);
  24.             Krawedz edge4 = new Krawedz(Wezel2, Wezel5, 7);
  25.             Krawedz edge5 = new Krawedz(Wezel2, Wezel4, 9);
  26.             Krawedz edge6 = new Krawedz(Wezel4, Wezel5, 15);
  27.             Krawedz edge7 = new Krawedz(Wezel4, Wezel6, 6);
  28.             Krawedz edge8 = new Krawedz(Wezel6, Wezel5, 8);
  29.             Krawedz edge9 = new Krawedz(Wezel6, Wezel7, 11);
  30.             Krawedz edge10 = new Krawedz(Wezel3, Wezel5, 5);
  31.             Krawedz edge11 = new Krawedz(Wezel5, Wezel7, 9);
  32.             graf.wierzcholki.Add(Wezel1);
  33.             graf.wierzcholki.Add(Wezel2);
  34.             graf.wierzcholki.Add(Wezel3);
  35.             graf.wierzcholki.Add(Wezel4);
  36.             graf.wierzcholki.Add(Wezel5);
  37.             graf.wierzcholki.Add(Wezel6);
  38.             graf.wierzcholki.Add(Wezel7);
  39.             graf.krawedzie.Add(edge1);
  40.             graf.krawedzie.Add(edge2);
  41.             graf.krawedzie.Add(edge3);
  42.             graf.krawedzie.Add(edge4);
  43.             graf.krawedzie.Add(edge5);
  44.             graf.krawedzie.Add(edge6);
  45.             graf.krawedzie.Add(edge7);
  46.             graf.krawedzie.Add(edge8);
  47.             graf.krawedzie.Add(edge9);
  48.             graf.krawedzie.Add(edge10);
  49.             graf.krawedzie.Add(edge11);
  50.             //graf.DFS(Wezel1);
  51.             //var podgraf = graf.Prima(Wezel1);
  52.             //foreach(var k in podgraf.wierzcholki)
  53.             //{
  54.             //    Console.WriteLine(k);
  55.             //}
  56.             //graf.Disktryj(Wezel1);
  57.             graf.Kruskal(Wezel1);
  58.             Console.Read();
  59.         }
  60.     }
  61.     public class Node
  62.     {
  63.         public string wartosc;
  64.         public Node(string wartosc)
  65.         {
  66.             this.wartosc = wartosc;
  67.         }
  68.         public override string ToString()
  69.         {
  70.             return this.wartosc.ToString();
  71.         }
  72.     }
  73.     public class Krawedz
  74.     {
  75.         public Node start;
  76.         public Node koniec;
  77.         public int waga;
  78.         public Krawedz(Node s, Node k, int w)
  79.         {
  80.             this.start = s;
  81.             this.koniec = k;
  82.             this.waga = w;
  83.         }
  84.         public Node ZnajdzDrugi(Node n)
  85.         {
  86.             return this.start == n ? this.koniec : this.start;
  87.         }
  88.         public override string ToString()
  89.         {
  90.             return $"{this.start} - {this.koniec}({this.waga})";
  91.         }
  92.     }
  93.     public class Para
  94.     {
  95.         public Node prev;
  96.         public int dlugosc;
  97.         public Para(Node n, int d)
  98.         {
  99.             this.prev = n;
  100.             this.dlugosc = d;
  101.         }
  102.     }
  103.     class Graph
  104.     {
  105.         public List<Krawedz> krawedzie = new List<Krawedz>();
  106.         public List<Node> wierzcholki = new List<Node>();
  107.         public List<Node> odwiedzone = new List<Node>();
  108.         public Dictionary<Node, Para> tabelka = new Dictionary<Node, Para>();
  109.         Krawedz[] kr_kruskal;
  110.         public List<Krawedz> ZnajdzKrawedzie(Node n)
  111.         {
  112.             List<Krawedz> wynik = new List<Krawedz>();
  113.             foreach(var x in krawedzie)
  114.             {
  115.                 if(x.start == n || x.koniec == n)
  116.                 {
  117.                     wynik.Add(x);
  118.                 }
  119.             }
  120.             return wynik;
  121.         }
  122.         public void DFS(Node n)
  123.         {
  124.             odwiedzone.Add(n);
  125.             Console.WriteLine("Odwiedzono wierzcholek: " + n.wartosc);
  126.             var l_krawedz = ZnajdzKrawedzie(n);
  127.             foreach(var x in l_krawedz)
  128.             {
  129.                 if (!odwiedzone.Contains(x.ZnajdzDrugi(n)))
  130.                 {
  131.                     DFS(x.ZnajdzDrugi(n));
  132.                 }
  133.             }
  134.         }
  135.         public void BFS(Node n)
  136.         {
  137.             Queue<Node> kolejka = new Queue<Node>();
  138.             kolejka.Enqueue(n);
  139.             odwiedzone.Add(n);
  140.             while (kolejka.Count > 0)
  141.             {
  142.                 n = kolejka.Dequeue();
  143.                 Console.WriteLine("Odwiedzono wierzcholek: " + n.wartosc);
  144.                 var l_krawedzi = ZnajdzKrawedzie(n);
  145.                 foreach(var x in l_krawedzi)
  146.                 {
  147.                     if (!odwiedzone.Contains(x.ZnajdzDrugi(n))){
  148.                         kolejka.Enqueue(x.ZnajdzDrugi(n));
  149.                         odwiedzone.Add(x.ZnajdzDrugi(n));
  150.                     }
  151.                 }
  152.             }
  153.         }
  154.         public Graph Prima(Node n)
  155.         {
  156.             Graph podgraf = new Graph();
  157.             podgraf.wierzcholki.Add(n);
  158.             List<Krawedz> l_krawedzi = new List<Krawedz>();
  159.             var kraw = ZnajdzKrawedzie(n);
  160.             l_krawedzi.AddRange(kraw);
  161.             l_krawedzi = l_krawedzi.OrderBy(x => x.waga).ToList();
  162.             while(l_krawedzi.Count>0)
  163.             {
  164.                 odwiedzone.Add(n);
  165.                 var kra = ZnajdzKrawedzie(n);
  166.                 l_krawedzi.AddRange(kra);
  167.                 l_krawedzi = l_krawedzi.OrderBy(x => x.waga).ToList();
  168.                 foreach(var k in l_krawedzi.ToList())
  169.                 {
  170.                     if(odwiedzone.Contains(k.koniec) && odwiedzone.Contains(k.start))
  171.                     {
  172.                         l_krawedzi.Remove(k);
  173.                     }
  174.                     if (!odwiedzone.Contains(k.koniec) && odwiedzone.Contains(k.start))
  175.                     {
  176.                         n = k.koniec;
  177.                         podgraf.wierzcholki.Add(n);
  178.                         podgraf.krawedzie.Add(k);
  179.                         l_krawedzi.Remove(k);
  180.                         break;
  181.                     }
  182.                     if (odwiedzone.Contains(k.koniec) && !odwiedzone.Contains(k.start))
  183.                     {
  184.                         n = k.start;
  185.                         podgraf.wierzcholki.Add(n);
  186.                         podgraf.krawedzie.Add(k);
  187.                         l_krawedzi.Remove(k);
  188.                         break;
  189.                     }
  190.  
  191.                 }
  192.  
  193.             }
  194.             return podgraf;
  195.  
  196.         }
  197.         public void Disktryj(Node n)
  198.         {
  199.             tabelka.Add(n, new Para(null, 0));
  200.             while (true)
  201.             {
  202.                 var element = tabelka.OrderBy(x => x.Value.dlugosc).FirstOrDefault(x => !this.odwiedzone.Contains(x.Key));
  203.                 if (element.Key == null) break;
  204.                 else
  205.                 {
  206.                     odwiedzone.Add(element.Key);
  207.                     var l_krawedzi = ZnajdzKrawedzie(element.Key);
  208.                     foreach(var k in l_krawedzi)
  209.                     {
  210.                         var drugi = k.ZnajdzDrugi(element.Key);
  211.                         if (tabelka.ContainsKey(drugi))
  212.                         {
  213.                             var nowa_dlugosc = element.Value.dlugosc + k.waga;
  214.                             if (tabelka[drugi].dlugosc > nowa_dlugosc)
  215.                             {
  216.                                 tabelka[drugi].prev = element.Key;
  217.                                 tabelka[drugi].dlugosc = nowa_dlugosc;
  218.                             }
  219.                         }
  220.                         else
  221.                         {
  222.                             tabelka.Add(drugi, new Para(element.Key, element.Value.dlugosc + k.waga));
  223.                         }
  224.                     }
  225.                 }
  226.             }
  227.             foreach(var x in tabelka)
  228.             {
  229.                 Console.WriteLine(x.Key + "->"+x.Value.prev + "=" + x.Value.dlugosc);
  230.             }
  231.         }
  232.         public void Kruskal(Node n)
  233.         {
  234.             kr_kruskal = new Krawedz[this.wierzcholki.Count - 1];
  235.             var posortowane = krawedzie.OrderBy(x => x.waga);
  236.             Dictionary<Node, Krawedz> s_wierzcholkow = new Dictionary<Node, Krawedz>();
  237.             foreach(var x in wierzcholki)
  238.             {
  239.                 s_wierzcholkow[x] = null;
  240.             }
  241.             int licznik = 0;
  242.             foreach(var k in posortowane)
  243.             {
  244.                 if (licznik == this.wierzcholki.Count) break;
  245.                 if(s_wierzcholkow[k.start] == null || s_wierzcholkow[k.start] != s_wierzcholkow[k.koniec])
  246.                 {
  247.                     kr_kruskal[licznik] = k;
  248.                     licznik++;
  249.                     if(s_wierzcholkow[k.koniec] !=null || s_wierzcholkow[k.start] != null)
  250.                     {
  251.                         var set1 = s_wierzcholkow[k.koniec];
  252.                         var set2 = s_wierzcholkow[k.start];
  253.                         for(int i = 0; i<wierzcholki.Count; i++)
  254.                         {
  255.                             if(s_wierzcholkow.ElementAt(i).Value !=null && (s_wierzcholkow.ElementAt(i).Value == set1 || s_wierzcholkow.ElementAt(i).Value== set2))
  256.                             {
  257.                                 s_wierzcholkow[s_wierzcholkow.ElementAt(i).Key] = k;
  258.                             }
  259.                         }
  260.                     }
  261.                     s_wierzcholkow[k.koniec] = k;
  262.                     s_wierzcholkow[k.start] = k;
  263.                 }
  264.             }
  265.             for(int i =0; i<kr_kruskal.Length; i++)
  266.             {
  267.                 Console.WriteLine(kr_kruskal[i]);
  268.             }
  269.         }
  270.  
  271.     }
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement