private void JakesAlgorithm(NodeDroppedEvent e)
        {
            var droppedNode = e.DroppedNodeInformation;

            Console.WriteLine($"Node {droppedNode.Value} dropped, starting recovery process...");

            TimingStatistic.Start();

            var paths = new ShortestPathsTable();

            foreach (var neighbor in droppedNode.Neighbors)
            {
                foreach (var otherNeighbor in droppedNode.Neighbors)
                {
                    //Console.WriteLine($"{neighbor.Value} {otherNeighbor.Value}");
                    if (neighbor == otherNeighbor)
                    {
                        continue;
                    }

                    if (!EdgeAlreadyExists(neighbor.Value, otherNeighbor.Value))
                    {
                        var shortestPath = ShortestPath <DijkstraSearch>(neighbor, otherNeighbor);
                        paths.AddPath(otherNeighbor.Value, neighbor.Value, shortestPath.CalculatePathCost());
                    }
                }
            }

            RemoveRedundantEdges(droppedNode.Neighbors, droppedNode);
            _nodes.RemoveAll(n => n.Value == droppedNode.Value);

            paths.TrimExcessPaths();
            FixEdges(paths);

            //PrintGraph();

            TimingStatistic.Stop();
            TimingStatistic.NodeInformation.NodeName      = droppedNode.Value;
            TimingStatistic.NodeInformation.NumberOfEdges = droppedNode.Edges.Count;
            Console.WriteLine($"Dropped Node had {droppedNode.Neighbors.Count} neighbors");
            Console.WriteLine($"----- Graph recovered in {TimingStatistic.ElapsedTime} msecs, {paths.GetSize()} edges added");
        }
 private void KruskalsAlgorithm(NodeDroppedEvent e)
 {
 }