-
[BOJ] 1005 ACM CraftPS/BOJ 2020. 7. 15. 13:29
https://www.acmicpc.net/problem/1005
1005번: ACM Craft
첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N 과 건물간의 건설순서규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부�
www.acmicpc.net
알고리즘: 위상 정렬
시간복잡도: O(n^2)
접근:
1. 건물 짓는 순서가 정해져 있음.
2. 각각의 건물들은 선행 건물들이 모두 지어져야 건설 가능.
Point: 순서, 선행(prev.) -> 위상 정렬
최종 시간복잡도: O(n^2)
더보기#include<iostream> #include<vector> #include<queue> #define MAX(a, b) (((a)>(b))?(a):(b)) using namespace std; int T, N, K, X, Y, W, h; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> T; while(T--) { cin >> N >> K; vector<int> D(N), p(N), TimeTable(N); vector<int> b[N]; queue<int> Q; for (int i = 0; i < N; i++) cin >> D[i]; for (int i = 0; i < K; i++) { cin >> X >> Y; p[Y-1]++; b[X-1].push_back(Y-1); } cin >> W; for (int i = 0; i < N; i++) { if (!p[i]) { Q.push(i); TimeTable[i] = D[i]; } } while(!Q.empty()) { h = Q.front(); Q.pop(); for (int i : b[h]) { p[i]--; TimeTable[i] = MAX(TimeTable[i], TimeTable[h] + D[i]); if (!p[i]) { Q.push(i); p[i]--; //check } } } cout << TimeTable[W-1] << "\n"; } return 0; }
'PS > BOJ' 카테고리의 다른 글
[BOJ] 1490 자리수로 나누기 (0) 2020.07.15 [BOJ] 12852 1로 만들기 2 (0) 2020.07.15 [BOJ] 1463 1로 만들기 (0) 2020.07.15 [BOJ] 1202 보석 도둑 (0) 2020.07.15 [BOJ] 1197 최소 스패닝 트리 (0) 2020.07.15