일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 2023
- 자바스크립트
- 우선 순위 큐
- dfs
- 백트래킹
- DP
- 크루스칼
- 회고록
- tensorflow
- pytorch
- 너비 우선 탐색
- back propagation
- BFS
- 조합론
- 다익스트라
- 가끔은_말로
- NEXT
- object detection
- 이분 탐색
- lazy propagation
- 분할 정복
- 가끔은 말로
- c++
- Overfitting
- 플로이드 와샬
- 미래는_현재와_과거로
- 알고리즘
- dropout
- 세그먼트 트리
- 문자열
Archives
- Today
- Total
Doby's Lab
백준 1005번: ACM Craft (C++) 본문
https://www.acmicpc.net/problem/1005
언뜻 보기에는 최단 경로를 구하는 문제인 듯해 보이지만 간선이 아닌 노드에 건물의 시간 값이 들어있기 때문에 최단 경로 문제가 아니다.
어떤 한 노드로 가는 길에 건물들을 다 짓는 데 걸리는 시간을 구하는 문제다.
건물을 짓는 데에는 순서가 있고, 이 순서를 코드로 짜야하는데 이 시점에서 Topological Sort를 떠올릴 수 있다.
문제에 나와있는 예시처럼 1번에서 4번 건물까지 지으려 할 때,
1번 건물에서 10초
2번 건물에서 1초, 3번 건물에서 100초
4번 건물에서 10초
가 소요된다.
1, 2, 3, 4 모든 건물을 지어야 하기 때문에 1번 건물 (10초) + 3번 건물 (100초) + 4번 건물 (10초)
>> 총 120초가 걸린다.
여기서 2번 건물이 포함되지 않은 이유는 3번 건물을 100초 동안 지을 때, 이미 2번 건물은 1초 만에 완성되었기 때문이다.
즉, 각 노드로 가면서 해당 노드까지 건물을 지은 시간을 갱신해주되 갱신될 수 있는 최댓값을 갱신하면 된다.
노드에서 노드로 가는 방식은 Topological Sort를 이용하면서 구현한다.
[AC 코드]
#include <iostream>
#include <vector>
#include <queue>
#define MAX 1001
#define INF 987654321
using namespace std;
int T;
int n, k;
int delay[MAX];
int inDegree[MAX];
vector<int> adj[MAX];
vector<int> result;
void init() {
for (int i = 1; i <= n; i++) {
delay[i] = 0;
inDegree[i] = 0;
while (!adj[i].empty()) {
adj[i].pop_back();
}
}
return;
}
void topologicalSort(int node) {
vector<int> dist(n + 1, 0);
queue<int> q;
for (int i = 1; i <= n; i++) {
if (inDegree[i] == 0) {
q.push(i);
dist[i] = delay[i];
}
}
while (!q.empty()) {
int now = q.front();
q.pop();
for (int i = 0; i < adj[now].size(); i++) {
int next = adj[now][i];
dist[next] = max(dist[next], dist[now] + delay[next]);
//cout << dist[next] << '\n';
inDegree[next] -= 1;
if (inDegree[next] == 0) {
q.push(next);
//cout << next << ' ';
}
}
}
result.push_back(dist[node]);
}
int main()
{
cin >> T;
for (int t = 0; t < T; t++) {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> delay[i];
}
for (int i = 0; i < k; i++) {
int a, b;
cin >> a >> b;
inDegree[b]++;
adj[a].push_back(b);
}
int w;
cin >> w;
topologicalSort(w);
init();
}
for (int i = 0; i < result.size(); i++) {
cout << result[i] << '\n';
}
return 0;
}
728x90
'PS > BOJ' 카테고리의 다른 글
백준 1516번: 게임 개발 (C++) (0) | 2022.03.10 |
---|---|
백준 2252번: 줄 세우기 (C++) (0) | 2022.03.09 |
백준 14567번: 선수과목 (Prerequisite) (C++), 위상 정렬 (0) | 2022.03.07 |
백준 17048번: 수열과 쿼리 24 (C++) (0) | 2022.03.07 |
[자료구조] 백준 1043번: 거짓말 (C++) (0) | 2022.03.07 |