using System; using System.Collections.Generic; using System.Windows.Forms; namespace Cwiczenia13_12_23 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Wezel4 wezel1 = new Wezel4(1); Wezel4 wezel2 = new Wezel4(2); Wezel4 wezel3 = new Wezel4(3); Krawedz krawedz1 = new Krawedz(wezel1, wezel2, 10); Krawedz krawedz2 = new Krawedz(wezel2, wezel3, 20); Graf graf = new Graf(krawedz1); graf.addANewPoint(wezel3); Graf minimumSpanningTree = graf.KruskalAlgorithm(); // Wyświetlenie wynikowego minimalnego drzewa rozpinającego foreach (Krawedz krawedz in minimumSpanningTree.krawedzie) { Console.WriteLine($"Start: {krawedz.poczatek.wartosc}, Koniec: {krawedz.koniec.wartosc}, Waga: {krawedz.waga}"); } } } class Krawedz { public int waga; public Wezel4 poczatek; public Wezel4 koniec; public Krawedz(Wezel4 firstPoint, Wezel4 secondPoint, int waga) { this.poczatek = firstPoint; this.koniec = secondPoint; this.waga = waga; } } class Wezel4 { public int wartosc; public Wezel4(int wartosc) { this.wartosc = wartosc; } } class Graf { public List krawedzie; public List wierzcholki; public Graf(Krawedz firstLink) { wierzcholki = new List(); krawedzie = new List(); this.wierzcholki.Add(firstLink.poczatek); this.wierzcholki.Add(firstLink.koniec); this.krawedzie.Add(firstLink); } /// /// The nuclear option, create a new graph straight away with the provided lists /// /// /// public Graf(List krawedzie, List wierzcholki) { this.wierzcholki = new List(); this.krawedzie = new List(); this.krawedzie = krawedzie; this.wierzcholki = wierzcholki; } public int newGraphsNeeded(Krawedz krawedz) { int newGraphCount = 0; if (!wierzcholki.Contains(krawedz.poczatek)) newGraphCount++; if (!wierzcholki.Contains(krawedz.koniec)) newGraphCount++; return newGraphCount; } public Graf KruskalAlgorithm() { var krawedzie = this.krawedzie.OrderBy(k => k.waga); List listaGrafow = new List(); foreach (var krawedz in krawedzie) { if (listaGrafow.Count == 0) { listaGrafow.Add(new Graf(krawedz)); continue; } Graf graph1 = null; // graf, do którego należy początek krawędzi Graf graph2 = null; // graf, do którego należy koniec krawędzi // Sprawdzanie, do których grafów należą węzły początkowe i końcowe krawędzi foreach (var graph in listaGrafow) { if (graph.wierzcholki.Contains(krawedz.poczatek)) { if (graph1 == null) graph1 = graph; else graph2 = graph; } if (graph.wierzcholki.Contains(krawedz.koniec)) { if (graph1 == null) graph1 = graph; else graph2 = graph; } } if (graph1 != graph2) // jeżeli wierzchołki należą do różnych grafów { // Dodawanie krawędzi do grafu graph1.krawedzie.Add(krawedz); // Łączenie grafów graph1.mergeGraph(graph2); listaGrafow.Remove(graph2); } } // Zwracanie grafu z minimalnym drzewem rozpinającym return listaGrafow[0]; } public void mergeGraph(Graf otherGraph) { foreach (Krawedz krawedz in otherGraph.krawedzie) { this.krawedzie.Add(krawedz); } foreach (Wezel4 wierzcholek in otherGraph.wierzcholki) { this.wierzcholki.Add(wierzcholek); } } public void addANewPoint(Wezel4 pointToAdd) { if (!wierzcholki.Contains(pointToAdd)) { wierzcholki.Add(pointToAdd); } } } }