関数化した。code
VI topological_sort(VV& G){
ll N = G.size();
VI IN(N, 0);
rep(i, N){
for(ll to : G[i]){
IN[to]++;
}
}
stack<ll> st;
rep(i, N){
if(IN[i]==0) st.push(i);
}
VI ret;
while(!st.empty()){
ll i = st.top();
st.pop();
ret.push_back(i);
for(ll to : G[i]){
IN[to]--;
if(IN[to]==0){
st.push(to);
}
}
}
for(ll in : IN){
if(in!=0){
VI empty_vector;
debug("not DAG");
return empty_vector;
}
}
return ret;
}
トポロジカルソートを使う別の問題 (verified)
- C 山田山本問題
- D - Restore the Tree
- C - 正直者の高橋くん
- D-People on a Line
- J-終わりなき旅 (DAG判定)
トポロジカルソートとdfs逆順の関係
木ではない帰りがけの使用例