ホームに戻る
トポロジカル・ソート

//トポロジカル・ソートは有向グラフであって、
//ノードを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;  
}
inserted by FC2 system