LintCode_拓扑排序_BFS实现

本文介绍了一种使用广度优先搜索(BFS)算法来实现拓扑排序的方法,该方法适用于大规模图的数据处理,避免了深度优先搜索(DFS)可能引起的栈溢出问题。文章通过实例展示了如何初始化节点的入度,并利用队列来逐步处理入度为0的节点,最终得到一个有效的拓扑排序结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇的文章是用DFS解决的,但如果遇到大规模图的时候会容易引起栈溢出,所以采用不涉及递归的BFS是个不错的选择。


#include <algorithm>
using namespace std;
/**
 * Definition for Directed graph.
 * struct DirectedGraphNode {
 *     int label;
 *     vector<DirectedGraphNode *> neighbors;
 *     DirectedGraphNode(int x) : label(x) {};
 * };
 */
const int MAX=99999;
class Solution {
public:
    /**
     * @param graph: A list of Directed graph node
     * @return: Any topological order for the given graph.
     */
    bool Visited[MAX]; //标记是否被加入
    int inque[MAX]; //入度
    queue<DirectedGraphNode*> temp; //辅助用的队列

    vector<DirectedGraphNode*> result;
    void bfs(DirectedGraphNode* r)  //广度优先搜索法,参数r是入度为0的结点
    {

        DirectedGraphNode* s;
        temp.push(r);
        Visited[r->label]=true;
        while(!temp.empty())
        {
            s=temp.front(); temp.pop();
            result.push_back(s); //将入度为0的点的label加入vector

            //遍历邻居
            for(int i=0;i<s->neighbors.size();i++)
            {
                inque[s->neighbors[i]->label]--;
                if(inque[s->neighbors[i]->label]==0&&Visited[s->neighbors[i]->label]==false)
                {
                    Visited[s->neighbors[i]->label]=true;
                    temp.push(s->neighbors[i]);
                }
            }
        }
    }
    vector<DirectedGraphNode*> topSort(vector<DirectedGraphNode*> graph) {
        for(int i=0;i<graph.size();i++)  //初始化数据
        {
                inque[graph[i]->label]=0;
                Visited[graph[i]->label]=false;
        }
        
        for(int i=0;i<graph.size();i++)  //统计每个节点的入度
            for(int j=0;j<graph[i]->neighbors.size();j++)
                inque[graph[i]->neighbors[j]->label]++;
                
        for(int i=0;i<graph.size();i++)
        {
            if(inque[graph[i]->label]==0&&Visited[graph[i]->label]==false)
                bfs(graph[i]);
        }
        return result;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值