拓扑排序

拓扑排序

  • 拓扑排序可视为对图上所有顶点不重不漏的遍历,因此可采用BFS或DFS实现

  • 拓扑排序的充要条件是其为DAG(有向无环图),若拓扑排序无解说明图该图不是DAG,因此可对图进行判环

  • 若为无向图可看做有向图进行拓扑排序(基环树)

  • 复杂度:O( V + E V+E V+E)

基于BFS的拓扑排序

无入度点优先(Kahn)

void bfs(){
    queue<vertex>q;//入度为0的队列
    for(int i=1;i<=n;i++)//顶点从1开始
        if(!v[i].in) q.push(v[i]);
    while(q.size()){
        cout<<q.front().d<<' ';
        int work=v[q.front().d].e;//当前工作指针,用于遍历所有依附于该点的边
        while(work!=-1){
            v[e[work].t].in--;
            if(!v[e[work].t].in) q.push(v[e[work].t]);
            work=e[work].n;
        }
        q.pop();
    }
}

扩展:求字典序的拓扑序

将Kahn算法中的队列换为优先队列即可。

无出度点优先

基于DFS的拓扑排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值