第一次看到用BFS写的拓扑排序
相比于DFS要容易理解的多
拓扑排序算法思想
1、在AOV网络中选一个没有直接前驱的顶点, 并输出之;
2、从图中删去该顶点, 同时删去所有它发出的有向边;
3、重复以上步骤, 直到
◆ 全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;
◆ 或者图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了。这时AOV网络中必定存在有向环。
用两种情况做的题目,深化理解(拓扑排序完成;AOV网络中必定存在有向环)
这种好实现: 其实说白了,拓扑排序就是一个广度优先搜索。 拓扑排序的方法如下: (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它. (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边. (3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
int graph[narray][narray]; //邻接阵
int indegree[narray]; //记录顶点的入度
int n; //n为顶点个数
memset(graph,0,sizeof(graph));
memset(indegree,0,sizeof(indegree));
for(i=1;i<=n;++i) //遍历n次每次找出一个顶点
{
for(j=1;j<=n;++j) //遍历所有的结点
{
if(indegree[j]==0)
{
indegree[j]--; //该顶点的入度为-1,防止该顶点被在此遍历到
if(i!=n) printf("%d ",j);
else printf("%d\n",j);
for(k=1;k<=n;++k)
{
if(graph[j][k])
indegree[k]--; //与该顶点关联的顶点的入度递减
}
break;
}
}
}
来自:http://blog.chinaunix.net/uid-26602509-id-3196077.html