【原理】
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
浙公网安备 33010602011771号