// Copyright © 2021 ์์ฃผํ. All rights reserved.
// https://www.acmicpc.net/problem/1005
// BOJ1005 ACM Craft
#include <iostream>
#include <queue>
#include <memory.h>
using namespace std;
int N, K,W; //N=๊ฑด๋ฌผ์ ๊ฐ์ , K=๊ฑด์ค์์ ๊ท์น ๊ฐ์, W=์น๋ฆฌํ๊ธฐ ์ํด ๊ฑด์คํด์ผ ํ ๊ฑด๋ฌผ
int indegree[1001];
int time[1001];
int totalTime[1001];
vector<int>graph[1001];
void itit() {
memset(time, 0, sizeof(time));
memset(totalTime, 0, sizeof(totalTime));
memset(indegree, 0, sizeof(indegree));
for (int i = 1; i <= N; i++) {
graph[i].clear();
}
}
void topologySort() { //์์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ํ
queue<int>q;
for (int i = 1; i <= N; i++) { //์ฒ์ ์์ํ ๋๋ ์ง์
์ฐจ์๊ฐ 0์ธ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
totalTime[i] = time[i];
if (indegree[i] == 0) q.push(i);
}
while (!q.empty()) {
if (indegree[W] == 0) break;
int now = q.front();
q.pop();
for (int i = 0; i < graph[now].size(); i++) {
indegree[graph[now][i]]--; // ํด๋น ์์์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ง์
์ฐจ์์์ 1๋นผ๊ธฐ
totalTime[graph[now][i]] = max(totalTime[graph[now][i]], time[graph[now][i]] +totalTime[now]);
if (indegree[graph[now][i]] == 0) q.push(graph[now][i]); //์๋กญ๊ฒ ์ง์
์ฐจ์๊ฐ 0์ด ๋๋ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
}
}
cout << totalTime[W]<<"\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int tk; cin >> tk;
while (tk--) {
cin >> N >> K;
for (int i = 1; i <= N; i++) { //๊ฑด์ค์ ๊ฑธ๋ฆฌ๋ ์๊ฐ ์
๋ ฅ
int t; cin >> t;
time[i] = t;
}
for (int i = 0; i < K; i++) {
int a, b; cin >> a >> b;
graph[a].push_back(b); // ์ ์ A์์ B๋ก ์ด๋๊ฐ๋ฅ
indegree[b] += 1; //์ง์
์ฐจ์ 1 ์ฆ๊ฐ
}
cin >> W;
topologySort();
itit(); //ํ
์คํธ ์ผ์ด์ค ์ฌ๋ฌ๊ฐ์ผ ์ ์์ผ๋ ์ด๊ธฐํ
}
}
'Algorithm ๐ง๐ปโ๐ป > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค,c++] 1015๋ฒ - ์์ด ์ ๋ ฌ (0) | 2021.10.16 |
---|---|
[๋ฐฑ์ค,c++] 1012๋ฒ - ์ ๊ธฐ๋ ๋ฐฐ์ถ (0) | 2021.10.16 |
[๋ฐฑ์ค,c++] 1010๋ฒ - ๋ค๋ฆฌ ๋๊ธฐ (0) | 2021.10.16 |
[๋ฐฑ์ค,c++] 1009๋ฒ - ๋ถ์ฐ์ฒ๋ฆฌ (0) | 2021.10.16 |
[๋ฐฑ์ค,c++] 1003๋ฒ - ํผ๋ณด๋์น ํจ์ (0) | 2021.10.16 |
[๋ฐฑ์ค,c++] 10026๋ฒ - ์ ๋ก์์ฝ (0) | 2021.10.16 |
๋๊ธ