Advertisement
IvetValcheva

Примерно решение №1

Oct 11th, 2022
990
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.30 KB | None | 0 0
  1. namespace _03._Emergency_Plan
  2. {
  3.     using System;
  4.     using System.Collections.Generic;
  5.     using System.Linq;
  6.     using Wintellect.PowerCollections;
  7.  
  8.     public class Edge
  9.     {
  10.         public int First { get; set; }
  11.  
  12.         public int Second { get; set; }
  13.  
  14.         public int Weight { get; set; }
  15.     }
  16.  
  17.     public class Program
  18.     {
  19.         private static Dictionary<int, List<Edge>> edgesByNode;
  20.         private static int[] prev;
  21.  
  22.         static void Main(string[] args)
  23.         {
  24.             var nodesCount = int.Parse(Console.ReadLine());
  25.             var ExitRooms = Console.ReadLine().Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
  26.             var edgesCount = int.Parse(Console.ReadLine());
  27.  
  28.             edgesByNode = ReadGraph(edgesCount);
  29.  
  30.             var inputTime = Console.ReadLine().Split(new[] { ":" }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
  31.             var timeInSecondsToSafeExit = inputTime[1] + (inputTime[0] * 60);
  32.  
  33.             var end = ExitRooms;
  34.  
  35.             for (int i = 0; i < nodesCount; i++)
  36.             {
  37.                 if (ExitRooms.Contains(i))
  38.                 {
  39.                     continue;
  40.                 }
  41.  
  42.                 if (!edgesByNode.ContainsKey(i))
  43.                 {
  44.                     Console.WriteLine($"Unreachable {i} (N/A)");
  45.                     continue;
  46.                 }
  47.  
  48.                 var start = i;
  49.  
  50.                 var maxNode = edgesByNode.Keys.Max();
  51.  
  52.                 var distances = new int[edgesCount + 1];
  53.                 for (int j = 0; j < distances.Length; j++)
  54.                 {
  55.                     distances[j] = int.MaxValue;
  56.                 }
  57.  
  58.                 distances[start] = 0;
  59.  
  60.                 prev = new int[nodesCount + 1];
  61.                 for (int j = 0; j < prev.Length; j++)
  62.                 {
  63.                     prev[j] = int.MaxValue;
  64.                 }
  65.  
  66.                 prev[start] = -1;
  67.  
  68.                 var queue = new OrderedBag<int>(Comparer<int>.Create((f, s) => distances[f] - distances[s]));
  69.                 queue.Add(start);
  70.  
  71.                 while (queue.Count > 0)
  72.                 {
  73.                     var minNode = queue.RemoveFirst();
  74.  
  75.                     var children = edgesByNode[minNode];
  76.  
  77.                     if (end.Contains(minNode))
  78.                     {
  79.                         break;
  80.                     }
  81.  
  82.                     foreach (var child in children)
  83.                     {
  84.                         var childNode = child.First == minNode ? child.Second : child.First;
  85.  
  86.                         if (distances[childNode] == int.MaxValue)
  87.                         {
  88.                             queue.Add(childNode);
  89.                         }
  90.  
  91.                         var newDistance = child.Weight + distances[minNode];
  92.  
  93.                         if (newDistance < distances[childNode])
  94.                         {
  95.                             distances[childNode] = newDistance;
  96.                             prev[childNode] = minNode;
  97.                             queue = new OrderedBag<int>(queue, Comparer<int>.Create((f, s) => distances[f] - distances[s]));
  98.                         }
  99.                     }
  100.                 }
  101.  
  102.                 var minTimeExit = 0;
  103.  
  104.                 if (end.Length > 1)
  105.                 {
  106.                     var timeOfEnds = new List<int>();
  107.  
  108.                     foreach (var end1 in end)
  109.                     {
  110.                         timeOfEnds.Add(distances[end1]);
  111.                     }
  112.  
  113.                     minTimeExit = timeOfEnds.Min();
  114.                 }
  115.                 else
  116.                 {
  117.                     minTimeExit = distances[end[0]];
  118.                 }
  119.  
  120.                 var isThereExit = false;
  121.  
  122.                 foreach (var end1 in end)
  123.                 {
  124.                     isThereExit = prev[end1] != int.MaxValue;
  125.  
  126.                     if (isThereExit == true)
  127.                     {
  128.                         break;
  129.                     }
  130.                 }
  131.  
  132.                 if (minTimeExit < 1)
  133.                 {
  134.                     continue;
  135.                 }
  136.  
  137.                 if (isThereExit)
  138.                 {
  139.                     if (minTimeExit > timeInSecondsToSafeExit)
  140.                     {
  141.                         int hours = minTimeExit / 3600;
  142.                         int mins = (minTimeExit % 3600) / 60;
  143.                         minTimeExit = minTimeExit % 60;
  144.  
  145.                         Console.WriteLine($"Unsafe {i} ({hours:D2}:{mins:D2}:{minTimeExit:D2})");
  146.                     }
  147.                     else
  148.                     {
  149.                         int hours = minTimeExit / 3600;
  150.                         int mins = (minTimeExit % 3600) / 60;
  151.                         minTimeExit = minTimeExit % 60;
  152.  
  153.                         Console.WriteLine($"Safe {i} ({hours:D2}:{mins:D2}:{minTimeExit:D2})");
  154.                     }
  155.                 }
  156.                 else
  157.                 {
  158.                     Console.WriteLine($"Unreachable {i} (N/A)");
  159.                 }
  160.             }
  161.         }
  162.  
  163.         private static Dictionary<int, List<Edge>> ReadGraph(int e)
  164.         {
  165.             var result = new Dictionary<int, List<Edge>>();
  166.  
  167.             for (int i = 0; i < e; i++)
  168.             {
  169.                 var edgeData = Console.ReadLine()
  170.                     .Split();
  171.  
  172.                 var inputTime = edgeData[2].Split(new[] { ":" }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
  173.  
  174.                 var firstNode = int.Parse(edgeData[0]);
  175.                 var secondNode = int.Parse(edgeData[1]);
  176.                 var weight = inputTime[1] + (inputTime[0] * 60);
  177.  
  178.                 if (!result.ContainsKey(firstNode))
  179.                 {
  180.                     result.Add(firstNode, new List<Edge>());
  181.                 }
  182.  
  183.                 if (!result.ContainsKey(secondNode))
  184.                 {
  185.                     result.Add(secondNode, new List<Edge>());
  186.                 }
  187.  
  188.                 var edge = new Edge
  189.                 {
  190.                     First = firstNode,
  191.                     Second = secondNode,
  192.                     Weight = weight,
  193.                 };
  194.  
  195.                 result[firstNode].Add(edge);
  196.                 result[secondNode].Add(edge);
  197.             }
  198.  
  199.             return result;
  200.         }
  201.     }
  202. }
  203.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement