示例#1
0
        public bool AddEdge(MyGraphEdge edge)
        {
            if (!isPresent(edge.GetFrom()) || !isPresent(edge.GetTo()))
            {
                return(false);
            }

            int   from = edge.GetFrom();
            int   to   = edge.GetTo();
            float cost = edge.GetCost();

            if (m_DListNode.ContainsKey(from))
            {
                m_DListNode[edge.GetFrom()].Add(new MyListGraphEdge(to, cost));
            }
            else
            {
                m_DListNode.Add(from, new List <MyListGraphEdge>());
                m_DListNode[from].Add(new MyListGraphEdge(to, cost));
            }

            //// Nếu là đồ thị vô hướng thì thêm 1 cạnh ngược lại
            if (!this.m_bDigraph)
            {
                if (m_DListNode.ContainsKey(to))
                {
                    m_DListNode[to].Add(new MyListGraphEdge(from, cost));
                }
                else
                {
                    m_DListNode.Add(to, new List <MyListGraphEdge>());
                    m_DListNode[to].Add(new MyListGraphEdge(from, cost));
                }
            }
            m_iNumEdge++;
            return(true);
        }
示例#2
0
        public bool AddEdge(MyGraphEdge edge)
        {
            if (!isPresent(edge.GetFrom()) || !isPresent(edge.GetTo()))
            {
                return false;
            }

            int from = edge.GetFrom();
            int to = edge.GetTo();
            float cost = edge.GetCost();

            if (m_DListNode.ContainsKey(from))
            {
                m_DListNode[edge.GetFrom()].Add(new MyListGraphEdge(to, cost));
            }
            else
            {
                m_DListNode.Add(from, new List<MyListGraphEdge>());
                m_DListNode[from].Add(new MyListGraphEdge(to, cost));
            }

            //// Nếu là đồ thị vô hướng thì thêm 1 cạnh ngược lại
            if (!this.m_bDigraph)
            {
                if (m_DListNode.ContainsKey(to))
                {
                    m_DListNode[to].Add(new MyListGraphEdge(from, cost));
                }
                else
                {
                    m_DListNode.Add(to, new List<MyListGraphEdge>());
                    m_DListNode[to].Add(new MyListGraphEdge(from, cost));
                }
            }
            m_iNumEdge++;
            return true;
        }
示例#3
0
        /// <summary>
        /// Tìm cây khung có trọng số nhỏ nhất
        /// </summary>
        /// <returns></returns>
        public MyListGraph PrimAlgo(MyGraphNode startNode)
        {
            MyListGraph result = new MyListGraph(this.m_bDigraph);

            List <int>         p_fNodes = new List <int>();
            List <MyGraphEdge> p_fEdges = new List <MyGraphEdge>();


            p_fNodes.Add(startNode.getIndex());

            while (p_fEdges.Count < this.m_Nodes.Count)
            {
                MyGraphEdge edge = PrimFindEdge(p_fNodes, p_fEdges);
                if (edge != null)
                {
                    p_fNodes.Add(edge.GetTo());
                    p_fEdges.Add(edge);
                }
                else
                {
                    // Đồ thị không liên thông
                    break;
                }
            }

            for (int i = 0; i < p_fNodes.Count; i++)
            {
                result.AddNode(new MyGraphNode(p_fNodes[i]));
            }
            for (int i = 0; i < p_fEdges.Count; i++)
            {
                result.AddEdge(p_fEdges[i]);
            }

            return(result);
        }