TopoSort
Topological sorting. Given is an oriented graph. Output is an ordering of vertices, such that there are edges only from left to right. If there are cycles, the returned list will have size smaller than n -- nodes reachable from cycles will not be returned.
Time: O(|V|+|E|) 8 lines stress-tested
content/graph/TopoSort.h — Unknown, source: predates tinyKACTL
vi topoSort(const vector<vi>& gr) {
vi indeg(sz(gr)), q;
for (auto& li : gr) for (int x : li) indeg[x]++;
rep(i,0,sz(gr)) if (indeg[i] == 0) q.push_back(i);
rep(j,0,sz(q)) for (int x : gr[q[j]])
if (--indeg[x] == 0) q.push_back(x);
return q;
}