题解 | #【模板】拓扑排序#

【模板】拓扑排序

https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c

#include <iostream>
#include <vector>
#include <deque>
using namespace std;

class Graph{
    public:
    vector<int> in;//入度数组
    vector<vector<int>> out;//出度二维数组
    vector<int> res; //输出队列
    Graph(int n){
    in.resize(n);
    for(int i=0;i<n;i++){ 
        out.push_back(vector<int>());
    }
    }
    bool topologicalSort(){
        deque<int> deq;
        for(int i=0;i<in.size();i++){
            if(in.at(i)==0)
                //入度为零入队
                deq.push_back(i);
        }
        while(!deq.empty()){
            //删除一个队中入度为0点u
            int u=deq.front();deq.pop_front();
            ////删除后进入输出队
            res.push_back(u+1);
            for(int j=0;j<out.at(u).size();j++){
                int v=out.at(u).at(j);
                //u的所有后继节点v入度-1
                in[v]--;
                if(in[v]==0)
                    //v成为新的入度为0点
                    deq.push_back(v);
            }
            //删除邻接表中的u,因为后继节点入度已经处理
            out.at(u).clear();
        }
        //num数等于节点数,不存在环;
        return res.size()==in.size();
    }
};

int main()
{
    int n,m;
    cin >> n >> m;
    Graph graph(n);
    for(int i = 0; i < m; ++i)
    {
        int from, to;
        cin >> from;
        cin >> to;
        //出现一次to,to入度+1(入度即前趋节点数)
        graph.in.at(to-1)++;
        //from点增加出度(邻接表长度)
        graph.out.at(from-1).push_back(to-1);
    }
    if(graph.topologicalSort())
    {
        for(int i = 0; i < n; ++i)
        {
            cout << graph.res.at(i);
            if(i != n - 1) cout << ' ';
        }
    }
    else
    {
        cout << -1;
    }
}


全部评论

相关推荐

刘湘_passion:太强了牛肉哥有被激励到
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务