示例#1
0
文件: Graph.cs 项目: svtz/GraphLabs
        private IVertex[] Vs; // Вершины графа

        #endregion Fields

        #region Constructors

        /// <summary>
        /// Создаёт новый граф с VertexCount вершинами.
        /// </summary>
        /// <param name="vertexCount">Число вершин новго графа.</param>
        /// <param name="isDirected">Равно true, если граф ориентированный.</param>
        public Graph(int vertexCount, bool isDirected)
        {
            if (vertexCount <= 0)
                throw new ArgumentOutOfRangeException("vertexCount", "Число вершин графа vertexCount должно быть больше 0.");
            M = new AdjMatrix(vertexCount, !isDirected);
            Vs = new Vertex[vertexCount];
            for (int i = 0; i < vertexCount; i++)
                Vs[i] = new Vertex((i + 1).ToString(CultureInfo.InvariantCulture.NumberFormat));
        }
示例#2
0
文件: Graph.cs 项目: svtz/GraphLabs
        /// <summary>
        /// Создаёт новый граф с матрицей смежности, представленной массивом Matrix.
        /// </summary>
        /// <param name="matrix">Двумерный массив, содержащий матрицу смежности нового графа.</param>
        /// <param name="isDirected">Равно true, если граф ориентированный.</param>
        public Graph(int[,] matrix, bool isDirected)
        {
            if (matrix == null)
                throw new ArgumentNullException("matrix");
            if (matrix.Length == 0)
                throw new ArgumentException("Число элементов матрицы matrix должно быть больше 0.", "matrix");
            int vCount = Convert.ToInt32(Math.Round(Math.Sqrt(matrix.Length)));

            bool Symmentrical = !isDirected;
            try
            {
                if (Symmentrical)
                    for (int i = 0; i < vCount; i++)
                    {
                        for (int j = i; j < vCount; j++)
                            if (matrix[i, j] != matrix[j, i])
                            {
                                throw new ArgumentException("Матрица смежности matrix должна быть симметричной.", "matrix");
                            }
                    }

                this.M = new AdjMatrix(vCount, Symmentrical);
                this.Vs = new Vertex[vCount];
                for (int i = 0; i < vCount; i++)
                {
                    this.Vertices[i] = new Vertex((i + 1).ToString(CultureInfo.InvariantCulture.NumberFormat));
                    if (Symmentrical)
                        for (int j = i; j < vCount; j++)
                        {
                            if (matrix[i, j] != 0 && matrix[i, j] != 1)
                                throw new ArgumentException("Элементом матрицы matrix может быть только 0 или 1.", "matrix");
                            M[i, j] = matrix[i, j];
                        }
                    else
                        for (int j = 0; j < vCount; j++)
                        {
                            if (matrix[i, j] != 0 && matrix[i, j] != 1)
                                throw new ArgumentException("Элементом матрицы matrix может быть только 0 или 1.", "matrix");
                            M[i, j] = matrix[i, j];
                        }
                }
            }
            catch (IndexOutOfRangeException)
            {
                throw new ArgumentException("Матрица matrix должна быть квадратной.", "matrix");
            }
        }