拓扑排序的bfs算法

第一次看到用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

你可能感兴趣的:(拓扑排序的bfs算法)