반응형
문제
https://www.acmicpc.net/problem/1516
접근방법
1) 접근 사고
2) 시간 복잡도
3) 배운 점
4) PS
정답 코드
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include<bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair<int,int>
#define mp(X,Y) make_pair(X,Y)
#define mt(X,Y) make_tuple(X,Y)
#define mtt(X,Y,Z) make_tuple(X,Y,Z)
#define ll long long
#define sz(v) (int)(v).size()
using namespace std;
const int MAX = 501;
int n;
//걸리는시간, 지을건물
vector<int> board[MAX];
int b_time[MAX];
int inDegree[MAX];
int main(void)
{
fastio;
cin >> n;
for (int t = 1; t <= n; t++)
{
int time;
cin >> time;
b_time[t] = time;
while (1)
{
int num;
cin >> num;
if (num == -1)
break;
//num건물들이 필요한 건물들의 리스트를 추가
board[num].push_back(t);
//지으려느 건물의 inDegree 설정
inDegree[t]++;
}
}
queue<int> q;
int ret[MAX] = { 0 };
for (int i = 1; i <= n; i++)
if (inDegree[i] == 0)
q.push(i);
while (!q.empty())
{
int cur = q.front();
q.pop();
ret[cur] += b_time[cur];
for (auto next : board[cur])
{
inDegree[next]--;
//건물을 짓기 위해서는 (해당 건물 건축 시간 + 건축 하는 건물 중에 가장 큰 시간)이다.
ret[next] = max(ret[next], ret[cur]);
if (inDegree[next] == 0)
q.push(next);
}
}
for (int i = 1; i <= n; i++)
cout << ret[i] << "\n";
}
|
cs |
반응형
'백준문제풀이 > TopologicalSort' 카테고리의 다른 글
2252번-줄 세우기 (0) | 2021.08.20 |
---|