1005 c++ - ACM Craft

2024. 10. 30. 15:09🐣/BOJ

위상정렬을 사용하면 쉽게 풀 수 있습니다.

 

[그래프/정렬/유향] 위상정렬 / Topological Sorting

위상정렬 / Topological Sorting 유향 비순환 그래프(Directed Acyclic Graph, DAG) 에서 각 노드들을 선형 순서로 나열하는 방법입니다. 여기서 유향 비순환 그래프란, 방향이 있는 그래프 중에 사이클이 없

chanhhh.tistory.com

1516번 문제와 거의 동일한 문제. 단 w의 값을 출력해주면 됩니다.

#include <iostream>
#include <queue>
#include <vector>

#define fastio ios::sync_with_stdio(0), cin.tie(0)
using namespace std;

int main() {
  fastio;
  int t;
  cin >> t;
  for (int i = 0; i < t; ++i) {
    int n, k;
    cin >> n >> k;

    vector<vector<int>> priorityBuild(n + 1);
    vector<int> buildTime(n + 1, 0);
    vector<int> totalTime(n + 1, 0);
    vector<int> inDegree(n + 1, 0);

    for (int j = 1; j <= n; j++) {
      cin >> buildTime[j];
      totalTime[j] = buildTime[j];
    }

    for (int j = 1; j <= k; j++) {
      int a, b;
      cin >> a >> b;
      priorityBuild[a].push_back(b);
      inDegree[b]++;
    }

    int w;
    cin >> w;

    queue<int> q;

    for (int j = 1; j <= n; j++) {
      if (inDegree[j] == 0) {
        q.push(j);
      }
    }

    while (!q.empty()) {
      int current = q.front();
      q.pop();

      for (int next : priorityBuild[current]) {
        inDegree[next]--;

        totalTime[next] =
            max(totalTime[next], totalTime[current] + buildTime[next]);

        if (inDegree[next] == 0) {
          q.push(next);
        }
      }
    }

    cout << totalTime[w] << "\n";
  }

  return 0;
}

'🐣 > BOJ' 카테고리의 다른 글

2623 c++ - 음악프로그램  (0) 2024.11.08
2239 c++ - 스도쿠  (0) 2024.10.31
5619 c++ - 세 번째  (0) 2024.10.24
26072 c++ - 곰곰이와 시소  (0) 2024.10.23
11052 c++ - 카드 구매하기  (0) 2024.10.23