图-----拓扑排序

拓扑排序方法如下:

1.从有向图中选择一个没有前驱(即入度为0)的结点并输出它。

2.从图中删去该结点,并删去从该结点出发的所有边。

3.重复(1)、(2),直到当前有向图中不存在没有前驱结点的结点为止,或者当前有向图中的所有结点均已输出为止。

Status TopoLogicalSort(ALGraph G)
{
//创建一个栈
	int i;
	Initstack(s);
//将入度为0的结点进栈
	for (i = 0;i < G.vexnum;++i)
		if (indegree[i])
			push(s, i);
//统计输出结点数
	count = 0;
//将栈顶结点弹出并打印,同时count加一
	while (!stackempty(s))
	{
		pop(s, i);
		printf(G.vertices[i].data);
		++count;
//依次遍历栈中结点
		for (p = G.vertices[i];p;p = p->next)
		{
//k为当前结点的邻接结点
			k = p->adjvex;
//当前结点的邻接结点入度减一,判断是否为0,为0则压入栈中
			if (--indegree[k])
				push(s, k);
		}
	}
//当count小于结点数即从栈中弹出的结点小于原结点数,代表有环,返回error,否则返回ok
	if (count < G.vexnum)
		return error;
	else
		return ok;
}

猜你喜欢

转载自blog.csdn.net/weixin_39916039/article/details/81810838