처음에 단순 BFS로 풀었는데 터졌다.
위상정렬을 써야 한다고 한다.
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 | #include <iostream> #include <algorithm> #include <vector> #define n_ 1000+5 using namespace std; vector<int> v[n_]; int arr[n_]; int ans[n_]; int cnt[n_]; void solve(int now){ cnt[now]--; for (int i : v[now]){ ans[i] = max(ans[i], ans[now] + arr[now]); cnt[i]--; if (!cnt[i]){ solve(i); } } } int main(void){ int T; cin >> T; while (T--){ int n, k,w; cin >> n >> k; for (int i = 1; i <= n; i++){ cin >> arr[i]; v[i].clear(); ans[i] = 0; cnt[i] = 0; } for (int j = 0; j < k; j++){ int a, b; cin >> a >> b; v[a].push_back(b); cnt[b]++; } cin >> w; for (int i = 1; i <= n; i++){ if (!cnt[i]){ solve(i); } } cout << ans[w] + arr[w] << endl; } } | cs |
'알고리즘 > PS' 카테고리의 다른 글
[백준 14651] 걷다보니 신천역 삼 (large) (0) | 2018.05.21 |
---|---|
[백준 14650] 걷다보니 신천역 삼 (small) (0) | 2018.05.21 |
[백준 1202] 보석도둑 (0) | 2018.05.18 |
[백준 13302] 리조트 (0) | 2018.05.18 |
[백준 7576] 토마토 (0) | 2018.05.18 |