위상정렬

위상정렬은 우선순위가 있는 일의 순서를 정하는 것이라고 할 수 있다.

따라서 사이클이 있는 그래프에서는 이를 찾을 수 없다. 사이클을 체크해서 가능한지 안한지 체크해야 한다.

DFS

vector<int> path; 

void dfs(int here) {
  visited[here] = true;
  for(auto there:adj[here]) {
    if(!visited[there])
      dfs(there);
  }
  path.emplace_back(here);
}

void topologicalSort() {
  for (int i=0; i<n; ++i) {
    if(!visited[i])
      dfs(i);
  }
  reverse(path.begin(), path.end());
}

BFS

int indegree[N]; 

void topologySort() {
  for(int i=0; i<N; ++i) {
    for(int j:adj[i]) {
      indegree[j]++;
    }
  }
  
  vector<int> path;
  queue<int> q; 
  for(int i=0; i<N; ++i) {
    if(!indegree[i]) {
      q.push(i);
    }
  }
  
  // indegree가 0이 되면 큐에 넣는다.
 	for(int here=0; here<N; ++here){
    if(q.empty()) {
      // 중간에 큐가 비면 위상정렬이 불가능하다는 것. 즉 사이클이 있다. 
      break;
    }
    int here = q.front();
    q.pop();
    path.emplace_back(here);
    for(auto& there:adj[here]) {
      indegree[there]--;
      if(indegree[there] == 0) {
        q.push(there);
      }
    }
  }
}

[jungin]
Written by@[jungin]
안녕하세요

GitHub