Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.97 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 Kruskal
  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.Kruskal();
  51.             for (int i = 0; i < graf.kruskal_kr.Length; i++)
  52.                 Console.WriteLine(graf.kruskal_kr[i]);
  53.             Console.Read();
  54.         }
  55.     }
  56.     class Node
  57.     {
  58.         public string wartosc;
  59.         public Node(string wartosc)
  60.         {
  61.             this.wartosc = wartosc;
  62.         }
  63.         public override string ToString()
  64.         {
  65.             return this.wartosc.ToString();
  66.         }
  67.     }
  68.     class Krawedz
  69.     {
  70.         public Node start;
  71.         public Node koniec;
  72.         public int waga;
  73.         public Krawedz(Node s, Node k, int w = 1)
  74.         {
  75.             this.start = s;
  76.             this.koniec = k;
  77.             this.waga = w;
  78.         }
  79.         public override string ToString()
  80.         {
  81.             return $"{this.start} - {this.koniec} ({this.waga})";
  82.  
  83.         }
  84.         public Node ZnajdzDrugi(Node n)
  85.         {
  86.             return this.start == n ? this.koniec : this.start;
  87.         }
  88.     }
  89.     class Graph
  90.     {
  91.         public List<Node> wierzcholki = new List<Node>();
  92.         public List<Krawedz> krawedzie = new List<Krawedz>();
  93.         public Krawedz[] kruskal_kr;
  94.         List<Node> odwiedzone = new List<Node>();
  95.         public List<Krawedz> ZnajdzKrawedzie(Node n)
  96.         {
  97.             List<Krawedz> wynik = new List<Krawedz>();
  98.             for (int i = 0; i < krawedzie.Count; i++)
  99.             {
  100.                 var k = this.krawedzie[i];
  101.                 if (k.start == n || k.koniec == n)
  102.                 {
  103.                     wynik.Add(k);
  104.                 }
  105.             }
  106.             return wynik;
  107.         }
  108.  
  109.         public void Kruskal()
  110.         {
  111.             kruskal_kr = new Krawedz[wierzcholki.Count - 1];
  112.             var posortowane_kraw = krawedzie.OrderBy(x => x.waga);
  113.             Dictionary<Node, Krawedz> s_wierzcholkow = new Dictionary<Node, Krawedz>();
  114.             foreach(var x in wierzcholki)
  115.             {
  116.                 s_wierzcholkow[x] = null;
  117.             }
  118.             int ilosc_wierz = 0;
  119.             foreach(var x in posortowane_kraw)
  120.             {
  121.                 if (ilosc_wierz == this.wierzcholki.Count) break;
  122.                 if (s_wierzcholkow[x.start] == null || s_wierzcholkow[x.start] != s_wierzcholkow[x.koniec])
  123.                 {
  124.                     kruskal_kr[ilosc_wierz] = x;
  125.                     ilosc_wierz++;
  126.                     if (s_wierzcholkow[x.start] != null || s_wierzcholkow[x.koniec] != null)
  127.                     {
  128.                         var set1 = s_wierzcholkow[x.start];
  129.                         var set2 = s_wierzcholkow[x.koniec];
  130.  
  131.                         for (int i = 0; i < wierzcholki.Count; i++)
  132.                             if (s_wierzcholkow.ElementAt(i).Value != null && (s_wierzcholkow.ElementAt(i).Value == set1 || s_wierzcholkow.ElementAt(i).Value == set2)) s_wierzcholkow[s_wierzcholkow.ElementAt(i).Key] = x;
  133.                     }
  134.                     s_wierzcholkow[x.start] = x;
  135.                     s_wierzcholkow[x.koniec] = x;
  136.                 }
  137.             }
  138.         }
  139.     }
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement