ホームに戻る
トポロジカル・ソート
//トポロジカル・ソートは有向グラフであって、
//ノードを1列にソートした時にエッジの向きに逆戻りが存在しないようなソート方法。
//トポロジカル・ソートが成立するグラフでしかトポロジカル・ソートは可能でない。
//発想はまず自身に向かうエッジが存在しないノードをキューに入れる。
//キューからノードを出し、向かう先のノードへのエッジを消す。
//新たに自身に向かうエッジが存在しないノードが発生したらキューに入れる。
//以上を繰り返す。
//キューから出た順に並べるとトポロジカル・ソートの順番になる。
//全てのノードが並ばなかった場合、トポロジカル・ソートは失敗する。
//計算量はO(V+E)。
// 以下はイメージ
int h[100100];
int main(){
int n,m;
cin>>n>>m;
vector<vector<int> > vv(n,vector<int>());
for(int i = 0; i < m; i++){
int a,b;
cin>>a>>b;
vv[a].pb(b);
h[b]++;
}
queue<int> q;
for(int i = 0; i < n; i++){
if(h[i]==0)q.push(i);
}
vector<int> v;
while(!q.empty()){
int a = q.front();
q.pop();
v.push_back(a);
for(int i = 0; i < vv[a].size(); i++){
int b = vv[a][i];
h[b]--;
if(h[b]==0)q.push(b);
}
}
if(v.size()!=n){
// false
}
for(int i = 0; i < v.size(); i++){
cout << v[i] << endl;
}
return 0;
}