Advertisement
sA1monxGod

Untitled

May 26th, 2021
1,040
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.33 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Contest
  6. {
  7.     internal class Edge
  8.     {
  9.         public int From { get; set; }
  10.         public int To { get; set; }
  11.         public int Cost { get; set; }
  12.  
  13.         public Edge(int @from, int to, int cost)
  14.         {
  15.             From = @from;
  16.             To = to;
  17.             Cost = cost;
  18.         }
  19.     }
  20.  
  21.     internal class Graph
  22.     {
  23.         private List<Edge> _edges;
  24.         private int _n;
  25.         private int _m;
  26.  
  27.         public Graph(int n, int m)
  28.         {
  29.             _edges = new List<Edge>();
  30.             _n = n;
  31.             _m = m;
  32.         }
  33.  
  34.         public void Add(Edge edge)
  35.         {
  36.             _edges.Add(edge);
  37.         }
  38.  
  39.         private static List<T> FillList<T>(int count, T value = default)
  40.         {
  41.             var result = new List<T>(count);
  42.  
  43.             for (var i = 0; i < count; i++)
  44.             {
  45.                 result.Add(value);
  46.             }
  47.  
  48.             return result;
  49.         }
  50.  
  51.         public IList<int> GetNegativeCycle()
  52.         {
  53.             var distance = FillList<int>(_n);
  54.             var parents = FillList(_n, -1);
  55.             var negativeChecker = -1;
  56.  
  57.             for (var i = 0; i < _n; i++)
  58.             {
  59.                 negativeChecker = -1;
  60.                 for (var j = 0; j < _m; j++)
  61.                 {
  62.                     if (distance[_edges[j].To] > distance[_edges[j].From] + _edges[j].Cost)
  63.                     {
  64.                         distance[_edges[j].To] = Math.Max(int.MinValue, distance[_edges[j].From] + _edges[j].Cost);
  65.                         parents[_edges[j].To] = _edges[j].From;
  66.                         negativeChecker = _edges[j].To;
  67.                     }
  68.                 }
  69.             }
  70.  
  71.             if (negativeChecker == -1)
  72.                 return null;
  73.  
  74.             var parent = negativeChecker;
  75.             for (var i = 0; i < _n; i++)
  76.                 parent = parents[parent];
  77.  
  78.             var path = new List<int>();
  79.             for (var current = parent; ; current = parents[current])
  80.             {
  81.                 path.Add(current + 1);
  82.                 if (current == parent && path.Count > 1)
  83.                     break;
  84.             }
  85.  
  86.             path.Reverse();
  87.  
  88.             return path;
  89.         }
  90.     }
  91.  
  92.     internal class Program
  93.     {
  94.         private static int[] ReadArgs()
  95.         {
  96.             return Console.ReadLine()
  97.                 .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
  98.                 .Select(int.Parse)
  99.                 .ToArray();
  100.         }
  101.  
  102.         private static void Main()
  103.         {
  104.             var args = ReadArgs();
  105.             int n = args[0], m = args[1];
  106.             var graph = new Graph(n, m);
  107.  
  108.             for (var i = 0; i < m; i++)
  109.             {
  110.                 args = ReadArgs();
  111.                 var edge = new Edge(args[0] - 1, args[1] - 1, args[2]);
  112.                 graph.Add(edge);
  113.             }
  114.  
  115.             var negativeCycle = graph.GetNegativeCycle();
  116.             if (negativeCycle == null)
  117.                 Console.WriteLine(-1);
  118.             else
  119.             {
  120.                 Console.WriteLine($"1\n{negativeCycle.Count - 1}");
  121.  
  122.                 var output = string.Join(" ", negativeCycle);
  123.                 Console.WriteLine(output);
  124.             }
  125.         }
  126.     }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement