博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

图2——排序

Posted on 2010-10-18 22:27  猴王无敌  阅读(116)  评论(0)    收藏  举报

【原理】

STEP1.找到图中没有连接的节点(就是邻接矩阵中都是0的那个节点)

STEP2.结果集中记录这个节点

STEP3.从图中删除这个节点(记得更新节点列表和邻接矩阵)

STEP4.如果节点列表不为空,则回到STEP1

【实现】

        #region Topo排序

        public List<CVertex> TopoSort()
        {
            List<CVertex> lstRes = new List<CVertex>();

            while (this.m_lstVertex.Count > 0)
            {
                var iCurVertexIndex = _GetNoSuccessorVertexIndex();
                if(iCurVertexIndex == RET_ISNOT_NOSUCCSSOR_VERTEX)
                {
                    Console.WriteLine("错误:图中存在回路...");
                    return null;
                }

                lstRes.Add(this.m_lstVertex[iCurVertexIndex]);
                _DelVertex(iCurVertexIndex);
            }

            return lstRes;
        }
        private int _GetNoSuccessorVertexIndex()
        {
            int iRes = RET_ISNOT_NOSUCCSSOR_VERTEX;

            //1.遍历每一行,判断是否是后继节点(不包含1即和其它节点没有连接)
            for (var iRowIndex = 0; iRowIndex < this.m_lstMatrix.Count; iRowIndex++)
            {
                if (!this.m_lstMatrix[iRowIndex].Contains(1))
                {
                    iRes = iRowIndex;

                    return iRes;
                }                
            }

            return iRes;
        }
        private void _DelVertex(int iVertexIndex)
        {
            //TODO:校验iVertexIndex

            //1.更新m_lstVertex
            this.m_lstVertex.RemoveAt(iVertexIndex);

            //2.更新m_lstMatrix
            _MoveCol(iVertexIndex);
            _MoveRow(iVertexIndex);
        }
        private void _MoveRow(int iRowIndex)
        {
            //TODO:校验iRowIndex
            this.m_lstMatrix.RemoveAt(iRowIndex);
        }
        private void _MoveCol(int iColIndex)
        {
            //TODO:校验iColIndex
            foreach(var oRow in this.m_lstMatrix)
            {
                oRow.RemoveAt(iColIndex);
            }
        }

        #endregion