< Summary

Information
Class: LeetCode.Algorithms.ModifyGraphEdgeWeights.ModifyGraphEdgeWeightsDijkstra
Assembly: LeetCode
File(s): D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Algorithms\ModifyGraphEdgeWeights\ModifyGraphEdgeWeightsDijkstra.cs
Line coverage
94%
Covered lines: 66
Uncovered lines: 4
Coverable lines: 70
Total lines: 128
Line coverage: 94.2%
Branch coverage
93%
Covered branches: 30
Total branches: 32
Branch coverage: 93.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ModifiedGraphEdges(...)93.75%161694.11%
Dijkstra(...)93.75%161694.11%
get_Node()100%11100%
get_Edge()100%11100%

File(s)

D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Algorithms\ModifyGraphEdgeWeights\ModifyGraphEdgeWeightsDijkstra.cs

#LineLine coverage
 1// --------------------------------------------------------------------------------
 2// Copyright (C) 2025 Eugene Eremeev (also known as Yevhenii Yeriemeieiv).
 3// All Rights Reserved.
 4// --------------------------------------------------------------------------------
 5// This software is the confidential and proprietary information of Eugene Eremeev
 6// (also known as Yevhenii Yeriemeieiv) ("Confidential Information"). You shall not
 7// disclose such Confidential Information and shall use it only in accordance with
 8// the terms of the license agreement you entered into with Eugene Eremeev (also
 9// known as Yevhenii Yeriemeieiv).
 10// --------------------------------------------------------------------------------
 11
 12namespace LeetCode.Algorithms.ModifyGraphEdgeWeights;
 13
 14/// <inheritdoc />
 15public class ModifyGraphEdgeWeightsDijkstra : IModifyGraphEdgeWeights
 16{
 17    /// <summary>
 18    ///     Time complexity - O((n + m) log n)
 19    ///     Space complexity - O(n + m)
 20    /// </summary>
 21    /// <param name="n"></param>
 22    /// <param name="edges"></param>
 23    /// <param name="source"></param>
 24    /// <param name="destination"></param>
 25    /// <param name="target"></param>
 26    /// <returns></returns>
 27    public int[][] ModifiedGraphEdges(int n, int[][] edges, int source, int destination, int target)
 328    {
 329        var adjacencyEdges = new List<Edge>[n];
 30
 3031        for (var i = 0; i < n; i++)
 1232        {
 1233            adjacencyEdges[i] = [];
 1234        }
 35
 2636        for (var i = 0; i < edges.Length; i++)
 1037        {
 1038            adjacencyEdges[edges[i][0]].Add(new Edge(edges[i][1], i));
 1039            adjacencyEdges[edges[i][1]].Add(new Edge(edges[i][0], i));
 1040        }
 41
 342        var distances = new int[n, 2];
 43
 3044        for (var i = 0; i < n; i++)
 1245        {
 1246            distances[i, 0] = distances[i, 1] = i == source ? 0 : int.MaxValue;
 1247        }
 48
 349        Dijkstra(adjacencyEdges, edges, distances, source, 0, 0);
 50
 351        var difference = target - distances[destination, 0];
 52
 353        if (difference < 0)
 054        {
 055            return [];
 56        }
 57
 358        Dijkstra(adjacencyEdges, edges, distances, source, difference, 1);
 59
 360        if (distances[destination, 1] < target)
 161        {
 162            return [];
 63        }
 64
 2265        foreach (var edge in edges)
 866        {
 867            if (edge[2] == -1)
 368            {
 369                edge[2] = 1;
 370            }
 871        }
 72
 273        return edges;
 374    }
 75
 76    private static void Dijkstra(List<Edge>[] adjacencyEdges, int[][] edges, int[,] distances, int source,
 77        int difference, int run)
 678    {
 679        var edgeDistancesPriorityQueue = new PriorityQueue<EdgeDistance, int>();
 80
 681        edgeDistancesPriorityQueue.Enqueue(new EdgeDistance(new Edge(source, -1), 0), 0);
 682        distances[source, run] = 0;
 83
 3084        while (edgeDistancesPriorityQueue.Count > 0)
 2485        {
 2486            var current = edgeDistancesPriorityQueue.Dequeue();
 87
 2488            if (current.Distance > distances[current.Edge.Node, run])
 089            {
 090                continue;
 91            }
 92
 15293            foreach (var edge in adjacencyEdges[current.Edge.Node])
 4094            {
 4095                var weight = edges[edge.Index][2];
 96
 4097                if (weight == -1)
 2198                {
 2199                    weight = 1;
 21100                }
 101
 40102                if (run == 1 && edges[edge.Index][2] == -1)
 9103                {
 9104                    var newWeight = difference + distances[edge.Node, 0] - distances[current.Edge.Node, 1];
 105
 9106                    if (newWeight > weight)
 3107                    {
 3108                        edges[edge.Index][2] = weight = newWeight;
 3109                    }
 9110                }
 111
 40112                var newDistance = distances[current.Edge.Node, run] + weight;
 113
 40114                if (distances[edge.Node, run] <= newDistance)
 22115                {
 22116                    continue;
 117                }
 118
 18119                distances[edge.Node, run] = newDistance;
 18120                edgeDistancesPriorityQueue.Enqueue(new EdgeDistance(edge, newDistance), newDistance);
 18121            }
 24122        }
 6123    }
 124
 253125    private record Edge(int Node, int Index);
 126
 145127    private record EdgeDistance(Edge Edge, int Distance);
 128}