/* 
        topo_sort(G): グラフG をトポロジカルソート
        返り値: トポロジカルソートされた頂点番号を持つ配列
        計算量: O(|E|+|V|)
        頂点間の距離も管理するときは構造体をつくること
*/
vector<long long> topo_sort(const vector<vector<long long>> &G)
{ // bfs
    vector<long long> ans;
    long long n = (long long)G.size();
    vector<long long> ind(n); // ind[i]: 頂点iに入る辺の数(次数)
    for (long long i = 0; i < n; i++)
    { // 次数を数えておく
        for (long long next : G[i])
        {
            ind[next]++;
        }
    }
    queue<long long> que;
    for (long long i = 0; i < n; i++)
    { // 次数が0の点をキューに入れる
        if (ind[i] == 0)
            que.push(i);
    }
    while (!que.empty())
    { // 幅優先探索
        long long now = que.front();
        ans.push_back(now);
        que.pop();
        for (long long next : G[now])
        {
            ind[next]--;
            if (ind[next] == 0)
            {
                que.push(next);
            }
        }
    }
    return ans;
}
    
    
© 2020 kacho65535