chacoderのブログ

競技プログラミングそのほか

ALDS1-ALDS1_11_B Depth First Search(精選24)

問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_11_B&lang=ja

DFSの基本ということですが悩みながら実装しました。
再帰を使うとシンプルに実装できてよかったです。

どこで時間が加算されるのかが難しかったです。

提出コード

#include <bits/stdc++.h>
using namespace std;

static const int limit=110;

int n,u,v,t;
int d[limit];
int f[limit];
int visited[limit];
int k[limit];

vector<int>vec[limit];

void dfs(int x){
  if(visited[x]==1){
    return;
  }
  visited[x]=1;
  t++;
  d[x]=t;
  for(int i=0;i<k[x];i++){
    dfs(vec[x].at(i));
  }
  t++;  
  f[x]=t;

}


int main(){
  cin>>n;

  
  //入力
  for(int i=0;i<n;i++){  
    cin>>u>>k[i];
    u--;
    for(int j=0;j<k[i];j++){
      cin>>v;
      v--;
      vec[u].push_back(v); 
    }
  }
  for(int i=0;i<n;i++){
    if(visited[i]==0){
      dfs(i);
      f[i]=t;
    }
  }
  
  //出力
  
  for(int i=0;i<n;i++){
    cout<<i+1<<" "<<d[i]<<" "<<f[i]<<endl;
  }
  return 0;
}