Advertisement
IvetValcheva

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

Oct 11th, 2022
773
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.82 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Wintellect.PowerCollections;
  5.  
  6. namespace _02.Third
  7. {
  8.     public class Edge
  9.     {
  10.         public int From { get; set; }
  11.         public int To { get; set; }
  12.         public int Time { get; set; }
  13.         public override string ToString()
  14.         {
  15.             return $"{From} {To} {Time}";
  16.         }
  17.  
  18.     }
  19.     class Program
  20.     {
  21.         private static List<Edge>[] graph;
  22.         static void Main(string[] args)
  23.         {
  24.             int n = int.Parse(Console.ReadLine());
  25.             var input = Console.ReadLine()
  26.                 .Split()
  27.                 .Select(int.Parse).ToArray();
  28.               var exits=new HashSet<int>(input);
  29.             int e = int.Parse(Console.ReadLine());
  30.             graph = ReadGraph(n, e, exits);
  31.             var limitArgs = Console.ReadLine();
  32.             int limit = FormatTimeArgs(limitArgs);
  33.  
  34.             var bestDistance = Enumerable.Repeat(int.MaxValue, n).ToArray();
  35.             foreach (var exit in exits)
  36.             {
  37.                 for (int node = 0; node < graph.Length; node++)
  38.                 {
  39.                     if (!exits.Contains(node))
  40.                     {
  41.                         var currDistance = GetDistance(node, exit);
  42.                         if (currDistance < bestDistance[node])
  43.                         {
  44.                             bestDistance[node] = currDistance;
  45.                         }
  46.                     }
  47.                 }
  48.             }
  49.             for (int node = 0; node < graph.Length; node++)
  50.             {
  51.                 if (!exits.Contains(node))
  52.                 {
  53.                     var currTime = bestDistance[node];
  54.                     if (currTime == int.MaxValue)
  55.                     {
  56.                         Console.WriteLine($"Unreachable {node} (N/A)");
  57.                         continue;
  58.                     }
  59.                     var timeHour = (currTime / 3600);
  60.                     var timeMinute = ((currTime - timeHour * 3600) / 60);
  61.                     var timeSecond = (currTime - timeHour * 3600 - timeMinute * 60);
  62.  
  63.                     var timeAsString = $"{timeHour.ToString().PadLeft(2, '0')}:" +
  64.                         $"{timeMinute.ToString().PadLeft(2, '0')}" +
  65.                         $":{timeSecond.ToString().PadLeft(2, '0')}";
  66.                     if (currTime > limit)
  67.                     {
  68.                         Console.WriteLine($"Unsafe {node} ({timeAsString})");
  69.                     }
  70.                     else
  71.                     {
  72.                         Console.WriteLine($"Safe {node} ({timeAsString})");
  73.                     }
  74.                 }
  75.             }
  76.         }
  77.  
  78.         private static int GetDistance(int startNode, int exit)
  79.         {
  80.             var distance = Enumerable.Repeat(int.MaxValue, graph.Length).ToArray();
  81.             distance[startNode] = 0;
  82.             var visited = new bool[graph.Length];
  83.             visited[startNode] = true;
  84.             var queue = new OrderedBag<int>
  85.                 (Comparer<int>.Create
  86.                 ((f, s) => distance[f] - distance[s]));
  87.             queue.Add(startNode);
  88.             while (queue.Count > 0)
  89.             {
  90.                 var node = queue.RemoveFirst();
  91.                 if (node == exit)
  92.                 {
  93.                     return distance[node];
  94.                 }
  95.  
  96.                 foreach (var child in graph[node])
  97.                 {
  98.                     var childNode = node == child.From
  99.                         ? child.To
  100.                         : child.From;
  101.                     if (distance[childNode] == int.MaxValue)
  102.                     {
  103.                         queue.Add(childNode);
  104.                     }
  105.                     var currDistance = child.Time + distance[node];
  106.                     if (currDistance < distance[childNode])
  107.                     {
  108.                         distance[childNode] = currDistance;
  109.                         queue = new OrderedBag<int>
  110.                             (queue, Comparer<int>.Create
  111.                             ((f, s) => distance[f] - distance[s]));
  112.                     }
  113.                 }
  114.             }
  115.             return int.MaxValue;
  116.         }
  117.  
  118.         private static List<Edge>[] ReadGraph(int n, int e, HashSet<int> exits)
  119.         {
  120.             var result = new List<Edge>[n];
  121.             for (int i = 0; i < n; i++)
  122.             {
  123.                 result[i] = new List<Edge>();
  124.             }
  125.             for (int i = 0; i < e; i++)
  126.             {
  127.                 var tokens = Console.ReadLine()
  128.                     .Split();
  129.                 int from = int.Parse(tokens[0]);
  130.                 int to = int.Parse(tokens[1]);
  131.  
  132.                 int time = FormatTimeArgs(tokens[2]);
  133.                 var edge = new Edge
  134.                 {
  135.                     From = from,
  136.                     To = to,
  137.                     Time = time
  138.                 };
  139.                 result[from].Add(edge);
  140.                 if (!exits.Contains(to))
  141.                 {
  142.                     result[to].Add(edge);
  143.                 }
  144.             }
  145.             return result;
  146.         }
  147.  
  148.         private static int FormatTimeArgs(string timeData)
  149.         {
  150.             int time = 0;
  151.             var timeArgs = timeData
  152.                     .Split(new[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
  153.             if (timeArgs[0][0] == '0')
  154.             {
  155.                 time += int.Parse(timeArgs[0][1].ToString()) * 60;
  156.             }
  157.             else
  158.             {
  159.                 time += int.Parse(timeArgs[0]) * 60;
  160.             }
  161.             if (timeArgs[1][0] == '0')
  162.             {
  163.                 time += int.Parse(timeArgs[1][1].ToString());
  164.             }
  165.             else
  166.             {
  167.                 time += int.Parse(timeArgs[1]);
  168.             }
  169.  
  170.             return time;
  171.         }
  172.     }
  173. }
  174.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement