C#有向图拓扑排序
来源:互联网 发布:电气工程软件 编辑:程序博客网 时间:2024/06/05 07:44
/// <summary>
/// 图的节点类
/// </summary>
public class GraphNode
{
private int inDegree;
private int outDegree;
private string nodeName;
/// <summary>
/// 节点入度
/// </summary>
public int InDegree
{
set { inDegree = value; }
get { return inDegree; }
}
/// <summary>
/// 节点出度
/// </summary>
public int OutDegree
{
set { outDegree = value; }
get { return outDegree; }
}
/// <summary>
/// 节点名称
/// </summary>
public string NodeName
{
get { return nodeName; }
}
/// <summary>
/// 构造函数
/// </summary>
public GraphNode()
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name='nodeName'>节点名称</param>
public GraphNode(string nodeName)
{
this.nodeName = nodeName;
}
}
/// <summary>
/// 有向图的排序算法类
/// </summary>
public class GraphDirecTopoSorted
{
private List<GraphNode> nodeList; //节点链表
private List<KeyValuePair<GraphNode, GraphNode>> edgeList; //边链表
/// <summary>
/// 构造函数
/// </summary>
/// <param name='node'>节点链表</param>
/// <param name='edge'>边链表</param>
public GraphDirecTopoSorted(List<GraphNode> node, List<KeyValuePair<GraphNode, GraphNode>> edge)
{
this.nodeList = node;
this.edgeList = edge;
}
/// <summary>
/// 计算节点的入度出度
/// </summary>
private void NodeInOutDegree()
{
foreach (GraphNode node in nodeList)
{
int inDegree = 0;
int outDegree = 0;
foreach (KeyValuePair<GraphNode, GraphNode> edge in edgeList)
{
if (edge.Value.NodeName == node.NodeName)
{
inDegree++;
}
if (edge.Key.NodeName == node.NodeName)
{
outDegree++;
}
}
node.InDegree = inDegree;
node.OutDegree = outDegree;
}
}
/// <summary>
/// 是否有环路,有则返回NULL,否则返回入度为零的节点
/// </summary>
/// <returns>入度为零的节点</returns>
private GraphNode HaveCycle()
{
GraphNode tempNode = new GraphNode();
NodeInOutDegree();
foreach (GraphNode node in nodeList)
{
if (node.InDegree == 0)
{
tempNode = node;
}
}
return tempNode;
}
/// <summary>
/// 删除节点对应的边
/// </summary>
/// <param name='node'>节点</param>
private void RemoveGraphEdge(GraphNode node)
{
for (int i = 0; i < edgeList.Count; )
{
if (edgeList[i].Key == node)
{
edgeList.RemoveAt(i);
}
else
{
i++;
}
}
}
/// <summary>
/// 有向图的排序
/// </summary>
/// <returns>排序后的节点链表</returns>
public List<GraphNode> TopoSorted()
{
List<GraphNode> sortResult = new List<GraphNode>();
while (nodeList.Count > 0)
{
GraphNode tempNode = HaveCycle();
if (tempNode != null)
{
sortResult.Add(tempNode);
nodeList.Remove(tempNode);
RemoveGraphEdge(tempNode);
}
}
return sortResult;
}
}
- C#有向图拓扑排序
- 有向图--拓扑排序
- 有向图的拓扑排序
- 有向图的拓扑排序
- 有向图的拓扑排序C++
- 图论-有向图的拓扑排序
- 有向图的拓扑排序
- 有向图的拓扑排序~TopologicalSort
- 有向图的拓扑排序
- 有向图的拓扑排序
- 有向图与拓扑排序
- 有向图 拓扑排序topoLogicalSort
- 有向图的拓扑排序
- 拓扑排序(判断有向图是否有回路)
- 拓扑排序(判断有向图是否有回路)
- 判断有向图是否有环及拓扑排序
- 拓扑排序(判断有向图是否有回路)
- 数据结构之图-有向图的拓扑排序(8)
- Linux下SVN服务器的搭建与配置
- asp.net2.0导出pdf文件完美解决方案[转载]
- [转]struct的初始化,拷贝及指针成员的使用技巧
- javascript中利用数组实现的循环队列
- WinCE下自定义Shell的方法
- C#有向图拓扑排序
- java调用mysql的工具类实现数据库远程备份,还原,生成创建表的sql脚本
- 在RFT中如何截取屏幕图像并保存到文件中?
- Ibatis中如何读取sqlMapConfig.xml文件
- 通过value传递对象的引用
- 【转】C语言之详解#ifdef、宏等妙用
- SONY CR13 实战 windows7
- 结合PHP使用HTML表单访问单个和多个表单值
- 典型的中断服务程序