[๋ฐฑ์ค(BOJ)] ACM Craft(1005) C++
๋ฌธ์ : BOJ_1005๋ฒ ์ด๋ชจํฐ์ฝ
๋ฌธ์ ์ค๋ช
์์์ ๋ ฌ, dp, bfs
๊ฐ ๊ฑด๋ฌผ๋ง๋ค ๊ทธ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด์ ๋จผ์ ์ง์ด์ ธ์ผ ํ๋ ๊ฑด๋ฌผ๋ค์ด ์กด์ฌํ๊ณ , ๋จผ์ ์ง์ด์ผ ํ๋ ๊ฑด๋ฌผ์ด ์๋ ๊ฑด๋ฌผ๋ถํฐ ์์ํ์ฌ ์ง์ ๋ ๊ฑฐ๋ฌผ์ ์ง์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ ์์ฑํ๋ ๋ฌธ์ ์
๋๋ค.
๊ฑด๋ฌผ์ ๋ํ ์๋ค ๊ด๊ณ๊ฐ ์๊ณ , ์ฌ์ดํด์ด ์๋๊ธฐ ๋๋ฌธ์ indegree๋ฅผ ์ด์ฉํ ์์์ ๋ ฌ ๋ฌธ์ ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋จผ์ ์ง์ด์ผ ํ๋ ๋ชจ๋ ๊ฑด๋ฌผ์ด ์ง์ด์ ธ์ผ ๋ค์ ๊ฑด๋ฌผ์ด ์ง์ด์ง๋ฏ๋ก, dp๋ฅผ ํ์ฉํ์ฌ ๊ฑด๋ฌผ์ด ์ง์ด์ง ์ ์๋ ์ต์ ์๊ฐ์ ๊ตฌํ ์ ์์ต๋๋ค.
Solution
ํ ๊ฑด๋ฌผ์ด ์ง์ด์ง๋ ์๊ฐ์ ๋ชจ๋ ์
๋ ฅ๋ฐ๊ณ (wait[]
), ์ต์ข
์ ์ผ๋ก ๊ทธ ๊ฑด๋ฌผ์ด ์ง์ด์ง ์ ์๋ ์ต์ ์๊ฐ์ ๋ํ ๋ฐฐ์ด์ ๋ง๋ ๋ค(res[]
), ์์์ ๋ ฌ์ ํตํด ์ ์ ์ ๋ํด ์ด์ด์ง indegree๋ฅผ ์ ๋ถ ํ์ํ๋ฉฐ ๊ทธ ๊ฑด๋ฌผ์ด ์ง์ด์ง ์ ์๋ ์๊ฐ๋ค์ ๊ฑด๋ฌผ๋ง๋ค ๊ฐ๊ฐ ์ฐพ์๋ด ๋ฐฐ์ด์ ๋ฃ๊ณ , ๋ฌธ์ ์์ ์ฃผ์ด์ง res ๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ํ์ด์ผ ํฉ๋๋ค.
Description
- ํ
์คํธ ์ผ์ด์ค๊ฐ ๋๋ ๋๋ง๋ค ๊ฐ ๋ฐฐ์ด์ ์ด๊ธฐํํด์ค์ผ ํฉ๋๋ค. (memset)
- ๋จผ์ ์ง์ด์ผ ํ๋ ๊ฑด๋ฌผ์ด ์๋ ๊ฑด๋ฌผ๋ค์ ๊ทธ ๊ฑด๋ฌผ์ด ์ง์ด์ง๋ ์๊ฐ ์์ฒด๊ฐ ์ต์ ์๊ฐ์ผ๋ก ์ง์ด์ง ์ ์๋ ์๊ฐ์ด๋ฏ๋ก,
indegree[i] == 0
์ธ i ๋ฒ ์งธ ๊ฑด๋ฌผ๋ค์ ๋ชจ๋res[i] = wait[i];
๋ก ํ ๋นํด์ค์ผ ํฉ๋๋ค.
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
int main(void) {
int roof;
cin >> roof;
for (int i = 0; i < roof; i++) {
vector<int>adj[1001];
queue<int>q;
int n, m, indegree[1001] = { 0, }, res[1001], wait[1001];
memset(indegree, 0, sizeof(indegree)); // ํ
์คํธ์ผ์ด์ค ๋ง๋ค memset์ผ๋ก ์ด๊ธฐํ
memset(res, 0, sizeof(res));
memset(wait, 0, sizeof(wait));
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> wait[i];
}
for (int i = 1; i <= m; i++) {
int a, b;
cin >> a >> b;
adj[a].push_back(b);
indegree[b]++; // ์ ํ ๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํ ๋ ๋ง๋ค indegree[]๋ฅผ ์ฌ๋ ค์ค๋๋ค.
}
int fin;
cin >> fin;
for (int i = 1; i <= n; i++) {
if (indegree[i] == 0) q.push(i);
res[i] = wait[i];
}
while (!q.empty()) {
int now = q.front();
q.pop();
for (int i = 0; i < adj[now].size(); i++) {
int next = adj[now][i];
res[next] = max(res[next], res[now] + wait[next]); // max()๋ฅผ ์ด์ฉํด ๋ชจ๋ indegree๋ฅผ ํ์ธํด์ฃผ๊ณ ๊ทธ ์ค ์ต๋๊ฐ์ res[i]์ ํ ๋นํฉ๋๋ค.
indegree[next]--;
if (indegree[next] == 0) q.push(next);
}
}
cout << res[fin] << endl;
}
return 0;
}
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ํผ๊ฑฐ์จ๊ณผ ์ฌ๊ณผ(2942) (0) | 2022.03.05 |
---|---|
[BOJ] ์ค ์ธ์ฐ๊ธฐ(2252) (0) | 2022.03.05 |
[BOJ] ์ด๋ชจํฐ์ฝ(14226) (0) | 2022.03.05 |
[BOJ] ์๋ผ์น๊ธฐ(17291) (0) | 2022.03.05 |
[BOJ] ๋ฌธ์ ์ง(1776) (0) | 2022.03.05 |