/*
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;
}