Exemplo n.º 1
0
        public void DoIt()
        {
            var helpList = new int[_graf.GetVertexCount()];

            foreach (var edge in _graf.GetEdgeList())
            {
                helpList[edge.StartVertex - 1]++;
                helpList[edge.FinishVertex - 1]++;
            }
            var counter = 0;

            foreach (var numOfVertex in helpList)
            {
                if (numOfVertex == 0)
                {
                    _result = "Нет Эйлерова цикла, граф несвязный";
                    return;
                }
                counter += numOfVertex % 2;
            }
            var floyd = new Floyd(_graf);
            var flag  = true;

            foreach (var edge in floyd.Matrix)
            {
                if (edge > 99999)
                {
                    flag = false;
                }
            }
            if (flag)
            {
                if (counter == 0)
                {
                    _result = "Есть Эйлеров цикл";
                    if (_mainDrawer.GetCheckedVetex() < 0)
                    {
                        return;
                    }
                    _mainDrawer.TimingDraw(GetEdgeList());
                    return;
                }
                else
                {
                    _result = "Нет Эйлерова цикла, есть вершины с нечетной степенью";
                    return;
                }
            }
            else
            {
                _result = "Нет Эйлерова цикла, граф несвязный";
                return;
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Отрисовка графа на форме
        /// </summary>
        /// <param name="data">Модель данных</param>
        public void Draw(GrafData data)
        {
            _mainDrawer.Draw(data);
            var edgeList = new List <EdgeForDGW>();

            foreach (var edge in _graf.GetEdgeList())
            {
                edgeList.Add(new EdgeForDGW
                {
                    Start  = edge.StartVertex,
                    Finish = edge.FinishVertex,
                    Weight = edge.Weight
                });
            }
            AddEdgeEvent?.Invoke(edgeList);
        }
Exemplo n.º 3
0
        internal static int[,] GetMatrix(Graf graf)
        {
            var count  = graf.GetVertexCount();
            var matrix = new int[count, count];

            foreach (var edge in graf.GetEdgeList())
            {
                if (edge.Route)
                {
                    matrix[edge.StartVertex - 1, edge.FinishVertex - 1] = edge.Weight;
                }
                else
                {
                    matrix[edge.StartVertex - 1, edge.FinishVertex - 1] = edge.Weight;
                    matrix[edge.FinishVertex - 1, edge.StartVertex - 1] = edge.Weight;
                }
            }

            return(matrix);
        }
Exemplo n.º 4
0
        public void DoIt()
        {
            var matrix     = ConvertToMatrix.GetMatrix(_graf);
            var copyMatrix = ConvertToMatrix.GetMatrix(_graf);
            var start      = _mainDrawer.GetVertexForDej() - 1;
            var finish     = _mainDrawer.GetVertexForDej() - 1;

            for (var i = 0; i < matrix.GetLength(0); i++)
            {
                for (var j = 0; j < matrix.GetLength(0); j++)
                {
                    if (matrix[i, j] == 0)
                    {
                        matrix[i, j]     = 999999999;
                        copyMatrix[i, j] = 999999999;
                    }
                }
            }

            var changed = true;

            while (changed)
            {
                changed = false;
                for (var i = 0; i < matrix.GetLength(0); i++)
                {
                    for (var j = 0; j < matrix.GetLength(0); j++)
                    {
                        for (var k = 0; k < matrix.GetLength(0); k++)
                        {
                            if (matrix[i, j] > matrix[i, k] + matrix[k, j])
                            {
                                matrix[i, j] = matrix[i, k] + matrix[k, j];
                                changed      = true;
                            }
                        }
                    }
                }
            }

            _result = matrix[start, finish].ToString();

            for (var i = 0; i < matrix.GetLength(0); i++)
            {
                matrix[i, i] = 0;
            }

            var vertexList = new List <int>();

            var s = matrix[start, finish];

            while (s > 0)
            {
                for (var i = 0; i < copyMatrix.GetLength(0); i++)
                {
                    if (copyMatrix[i, finish] < 10000)
                    {
                        if (s - copyMatrix[i, finish] == matrix[start, i])
                        {
                            s -= copyMatrix[i, finish];
                            vertexList.Add(finish + 1);
                            finish = i;
                            break;
                        }
                    }
                }
            }

            vertexList.Add(start + 1);
            vertexList.Reverse();

            var edgeList = new List <Edge>();

            for (var i = 0; i < vertexList.Count - 1; i++)
            {
                var edge = _graf.GetEdgeList().FirstOrDefault(e =>
                                                              e.StartVertex == vertexList[i] && e.FinishVertex == vertexList[i + 1]);
                if (edge != null)
                {
                    edgeList.Add(edge);
                }
            }

            _mainDrawer.TimingDraw(edgeList);
        }