본문 바로가기
알고리즘/백준 & swacademy

BOJ 1005 - ACM 크래프트 (위상정렬)

by sun__ 2019. 8. 19.

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

 

1005번: ACM Craft

첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N 과 건물간의 건설순서규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부터 N번까지 존재한다)  둘째 줄에는 각 건물당 건설에 걸리는 시간 D가 공백을 사이로 주어진다. 셋째 줄부터 K+2줄까지 건설순서 X Y가 주어진다. (이는 건물 X를 지은 다음에 건물 Y를 짓는 것이 가능하다는 의미이다)  마지막 줄에는 백준이가 승리하기 위해 건

www.acmicpc.net

 

주석에 중요문장이라고 표시한 문장이 다른 곳에서도 종종 쓰인다.

 

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	int tc; cin >> tc;

	while (tc--) {
		int n, k; cin >> n >> k;
		int w[1001], ind[1001], time[1001];
		for (int i = 0; i < n; i++) {
			cin >> w[i];
			time[i] = w[i];
			ind[i] = 0;
		}
		vector<vector<int>> adj(n);
		for (int i = 0,u,v; i < k; i++) {
			cin >> u >> v;
			adj[u - 1].push_back(v - 1);
			ind[v - 1]++;
		}
		int target; cin >> target;

		queue<int> q;
		for (int i = 0; i < n; i++) if (ind[i] == 0) q.push(i);

		while (!q.empty()) {
			int curr = q.front();
			q.pop();
			for (int next : adj[curr]) {
            		//@중요문장@
				time[next] = max(time[next], time[curr] + w[next]);
				if (--ind[next] == 0) q.push(next);
			}
		}

		cout << time[target-1] << '\n';
	}
	
}