알고리즘 문제 해결/BOJ

[위상 정렬] BOJ 1005 ACM Craft

jmkimmessi 2022. 6. 20. 03:44
반응형

https://www.acmicpc.net/problem/1005

 

1005번: ACM Craft

첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부

www.acmicpc.net

 

문제 해결 알고리즘

 

전형적인 위상 정렬 알고리즘을 활용한 문제이다.

 

작업 시간이 있는 것이 좀 다른데, 이것은 계속해서 결괏값을

먼저 해야할 작업이 걸린 시간 + 현재 해야할 작업이 걸리는 시간과 계속 비교해주면서 더 큰 쪽을 결괏값에 대입해준다.

 

https://kimmessi.tistory.com/194

 

[위상 정렬] BOJ 2056 작업

https://www.acmicpc.net/problem/2056 2056번: 작업 수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라..

kimmessi.tistory.com

위의 링크에 문제와 거의 같은 문제라고 봐도 된다.

 

아래의 링크에 위상 정렬 알고리즘에 대한 자세한 설명이 나와있다.

 

https://kimmessi.tistory.com/207

 

[알고리즘] 위상 정렬 (Topology Sort) - BFS

위상 정렬이란? 순서가 정해져있는 작업을 차례로 수행하여야할 때 그 순서를 결정해주기 위해 사용하는 알고리즘이다. 사이클이 없는 방향 그래프의 모든 노드를 방향성에 거스르지 않도록 순

kimmessi.tistory.com

 

소스 코드

 

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

int T, N, K, W;

int indegree[1002];
int Time[1002];
vector<int> graph[1002];

void topologySort(){
    vector<int> result(1002);
    queue<int> q;

    for(int i=1;i<=N;i++){
        if(indegree[i] == 0) {
            q.push(i);
            result[i] = Time[i];
        }
    }

    while(!q.empty()){

        int now = q.front();
        q.pop();

        for(int i=0;i<graph[now].size();i++){

            indegree[graph[now][i]]--;

            result[graph[now][i]] = max(result[graph[now][i]], result[now] + Time[graph[now][i]]);

            if(indegree[graph[now][i]] == 0){

                q.push(graph[now][i]);


            }
        }
    }

    cout << result[W] << '\n';
}

int main(){

    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> T;

    for(int i=0;i<T;i++){
        cin >> N >> K;

        for(int i=1;i<=N;i++) cin >> Time[i];

        for(int i=0;i<K;i++){
            int X, Y; cin >> X >> Y;

            graph[X].push_back(Y);

            indegree[Y]++;
        }
        
        cin >> W;

        topologySort();

        for(int i=0;i<1002;i++){
            Time[i] = 0;
            while(!graph[i].empty()) graph[i].pop_back();
        }

    }
}
반응형