private Graph <int> MapToGraph(MatrixInfoDto matrixInfo)
        {
            var nodesMap = matrixInfo.Indexes.ToDictionary(k => k, v => v);
            var graph    = new Graph <int>();

            graph.AddNodes(matrixInfo.Indexes);
            for (int i = 0; i < matrixInfo.TotalRows; i++)
            {
                for (int j = 0; j < matrixInfo.TotalColumns; j++)
                {
                    var index = GetIndex(i, j, matrixInfo.TotalColumns);
                    if (nodesMap.ContainsKey(index))
                    {
                        var neighborCandidates = GetNeighborCandidates(index, matrixInfo.TotalRows, matrixInfo.TotalColumns);
                        foreach (var neighbor in neighborCandidates)
                        {
                            if (nodesMap.ContainsKey(neighbor.Index))
                            {
                                graph.AddEdge(index, neighbor.Index);
                            }
                        }
                    }
                }
            }

            return(graph);
        }
        public async Task <IActionResult> Solve([FromBody] MatrixInfoDto matrixInfo)
        {
            try
            {
                var graph    = MapToGraph(matrixInfo);
                var retValue = await Task.Run(() => graph.GetConnectedComponents());

                return(Ok(retValue));
            }
            catch (Exception ex)
            {
                return(BadRequest($"Unable to calculate components: {ex.Message}"));
            }
        }