각 마을에 있는 늑대와 양의 수를 island 배열에 저장한다. 이때 늑대의 수는 음수로 저장하도록 했다.
양이 1번 섬으로 들어오는 최대 수를 알아야 한다. 따라서 1번 섬에서 시작해서 양을 데려온다는 생각으로 dfs를 수행했다.
1.
만약 현재 섬이 리프 노드이고 양이 살고 있다면 양을 데리고 올 수 있다. return 양의 수
만약 현재 섬이 리프 노드이고 늑대가 살고 있다면 0을 리턴한다.
2.
현재 섬에 살고있는 양 또는 늑대(음수)를 현재 데려올 수 있는 양의 수에 더해준다.
그리고 현재 섬과 연결된 모든 섬에서 양을 데려와서 현재 양의 수에 더해준다.(늑대를 데려오는 경우(음수인 경우)는 0을 더해준다.)
3.
만약 현재 연결된 섬까지 데려온 양의 수가 음수라면 양들은 모두 늑대에게 먹혀 현재 섬을 통과할 수 없음을 의미한다.
따라서 0을 리턴한다.
양을 현재 섬까지 데려올 수 있다면 그 수를 리턴한다.
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
66
67
|
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#define fasti ios_base::sync_with_stdio(false); cin.tie(0);
#define fastio ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 1e9+7
#define pii pair<int, int>
typedef long long ll;
// typedef pair<int, int> pii;
using namespace std;
int N;
ll ans;
vector<int> tree[123457];
ll island[123457];
void input(){
cin >> N;
char t;
ll a;
int p;
for(int i = 2; i <= N; i++){
cin >> t >> a >> p;
tree[p].push_back(i);
if(t == 'S') island[i] = a;
else island[i] = -a;
}
}
ll dfs(int now){
if(tree[now].empty()){
if(island[now] > 0) return island[now];
else return 0;
}
ll sum = 0;
sum += island[now];
for(int i = 0; i < tree[now].size(); i++){
int next = tree[now][i];
sum += dfs(next);
}
if(sum < 0) return 0;
return sum;
}
void solve(){
ans = dfs(1);
cout << ans << "\n";
}
int main(){
fastio
input();
solve();
return 0;
}
|
cs |
'Algorithm > BOJ' 카테고리의 다른 글
[백준 1234] 크리스마스 트리 (C++) (0) | 2021.10.06 |
---|---|
[백준 2479] 경로찾기 (C++) (0) | 2021.09.29 |
[백준 15591] MooTube(Silver) (C++) (0) | 2021.09.28 |
[백준 3980] 선발 명단 (C++) (0) | 2021.09.15 |
[백준 1339] 단어수학 (C++) (0) | 2021.09.12 |