Advertisement
sA1monxGod

Untitled

Mar 20th, 2021
675
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.63 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5.  
  6. namespace contest
  7. {
  8. //прим
  9.     public class Edge
  10.     {
  11.         public int From { get; }
  12.         public int To { get; }
  13.         public int Weight { get; }
  14.  
  15.         public Edge(int from, int to, int weight)
  16.         {
  17.             if (from > to)
  18.             {
  19.                 var temp = from;
  20.                 from = to;
  21.                 to = temp;
  22.             }
  23.  
  24.             From = from;
  25.             To = to;
  26.             Weight = weight;
  27.         }
  28.     }
  29.  
  30.     public class EdgeComparer : IComparer<Edge>
  31.     {
  32.         public int Compare(Edge x, Edge y)
  33.         {
  34.             if (x.Weight.CompareTo(y.Weight) != 0) return x.Weight.CompareTo(y.Weight);
  35.  
  36.             return x.From.CompareTo(y.From) == 0 ? x.To.CompareTo(y.To) : x.From.CompareTo(y.From);
  37.         }
  38.     }
  39.  
  40.     public class Graph
  41.     {
  42.         private SortedSet<Edge> edges;
  43.         private int VertexCount { get; }
  44.  
  45.         public Graph(int vertexCount)
  46.         {
  47.             edges = new SortedSet<Edge>(new EdgeComparer());
  48.             VertexCount = vertexCount;
  49.         }
  50.  
  51.         public void AddEdge(Edge e)
  52.         {
  53.             edges.Add(e);
  54.         }
  55.  
  56.         private static void Fill<T>(ICollection<T> list, int count, T value)
  57.         {
  58.             for (var i = 0; i < count; i++)
  59.             {
  60.                 list.Add(value);
  61.             }
  62.         }
  63.  
  64.         public IEnumerable<Edge> GetMinimalSpanningTree()
  65.         {
  66.             var result = new List<Edge>();
  67.             var vertexes = new HashSet<int>();
  68.             var temp= new Edge[edges.Count];
  69.             edges.CopyTo(temp);
  70.             var allEdges = new SortedSet<Edge>(temp, new EdgeComparer());
  71.  
  72.             var edge = allEdges.First();
  73.             allEdges.Remove(edge);
  74.             vertexes.Add(edge.From);
  75.             vertexes.Add(edge.To);
  76.             result.Add(edge);
  77.  
  78.             while (vertexes.Count < VertexCount)
  79.             {
  80.                 foreach (var currentEdge in allEdges.Where(currentEdge => vertexes.Contains(currentEdge.From) && !vertexes.Contains(currentEdge.To) ||
  81.                                                                           vertexes.Contains(currentEdge.To) && !vertexes.Contains(currentEdge.From)))
  82.                 {
  83.                     result.Add(currentEdge);
  84.                     allEdges.Remove(currentEdge);
  85.                     vertexes.Add(currentEdge.From);
  86.                     vertexes.Add(currentEdge.To);
  87.                     break;
  88.                 }
  89.             }
  90.  
  91.             return result;
  92.         }
  93.     }
  94.  
  95.  
  96.     internal static class Program
  97.     {
  98.         private static void Main()
  99.         {
  100.             var sr = new StreamReader("input.txt");
  101.             var sw = new StreamWriter("output.txt");
  102.             var line = sr.ReadLine()
  103.                 ?.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)
  104.                 .ToArray();
  105.  
  106.             var n = line[0];
  107.             var m = line[1];
  108.             var graph = new Graph(n);
  109.  
  110.             for (var i = 0; i < m; i++)
  111.             {
  112.                 line = sr.ReadLine()
  113.                     ?.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)
  114.                     .ToArray();
  115.  
  116.                 var edge = new Edge(line[0], line[1], line[2]);
  117.  
  118.                 graph.AddEdge(edge);
  119.             }
  120.  
  121.             foreach (var edge in graph.GetMinimalSpanningTree())
  122.             {
  123.                 sw.WriteLine($"{edge.From} {edge.To}");
  124.             }
  125.  
  126.             sr.Close();
  127.             sw.Close();
  128.         }
  129.     }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement