拓扑排序小记

两种拓扑排序方法:  dfs和bfs的。

 

先看bfs, 核心在于维护节点的剩余入度(这个词是自造的,因为入度不为0的节点的全部前继节点都被遍历过之后,该节点入度就变为0了)

每次搜索都把 剩余入度为0的节点 添加进拓扑序列末尾。 因为这个时候,他的前继节点已经都在拓扑序列中了。

 

剩余入度怎么维护?

首先搜索的起始点必定是入度为0的点,其他节点的剩余入度初始化为入度值。

每当节点A的剩余入度变为0的时候,A的所有后继节点剩余入度减一。 因为A的剩余入度为0,说明不可能再从A进入他的后继了。

	queue<int> q;
	vector<int> topoSeq;
	for(int i=0; i<n; i++)
	{
		if( predecessor[i] == 0) //入度为0 
		{
			q.push(i); 
		}
	}
	
	int cur;
	while( !q.empty())
	{
		cur = q.front();
		topoSeq.push_back( cur ); //队列头 必然是入度为0的
		for (int i=0; i<n; i++)  // 遍历后继
		{
			if( G[cur][i] < infinity )
			{
				
				--predecessor[i];  //节点i的前节点cur入度是0,已经不可能经过 cur再进入节点i了,所以节点i的入读需要减一 
				if (predecessor[i] == 0) // 节点i的最后一个未入口也访问完了,i已经没有前节点 
				{
					q.push(i); 
				} 
			}  
		} 
		q.pop();
	}

 

 

 

BFS的做法是从起点到终点构造出 拓扑序列的。

而DFS的做法,因为要到图的末尾才返回,那么构造拓扑序列则是从后往前的。

 

topologySort(   topoSeq, Vertex, visited[])
{
         visited[ v ] = true;
         for (i=0;   i<  successor[v].size(); i++)
         {
                  w = successor[v][ i ];
                  if(  isvisited[w] == true )  continue;
                  topologySort( topoSeq, w, visited );
         }
         topoSeq.insertHead( v );
}

for( v=0; v<VertexCount; v++)
{
        if ( visited[ v ] == false)    topologySort(topoSeq, v, visited );
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值