>>992
トポロジカルオーダーの逆順で表示する

#define N 8 
int edge[N][N] = { 
/* 0 1 2 3 4 5 6 7 */ 
  {0,1,0,0,1,0,0,0}, /* 0 */ 
  {0,0,0,0,0,0,1,0}, /* 1 */ 
  {0,0,0,1,0,0,1,0}, /* 2 */ 
  {0,0,0,0,0,0,0,1}, /* 3 */ 
  {0,0,0,0,0,1,0,0}, /* 4 */ 
  {0,0,0,0,0,0,1,0}, /* 5 */ 
  {0,0,0,0,0,0,0,1}, /* 6 */ 
  {0,0,0,0,0,0,0,0} /* 7 */ 
}; 
int mark[N];
void visit(int v) {
  int i;
  for (i = 0; i < N; ++i)
    if (edge[v][i] && !mark[i]) visit(i);
  printf("%d ", v);
  mark[v] = 1;
}
main() {
  int i;
  for (i = 0; i < N; ++i) 
    if (!mark[i]) visit(i);
}