BOJ 1005. ACM Craft
๐โโ๏ธ[Gold III] ACM Craft - 1005
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2828 KB, ์๊ฐ: 164 ms
๋ถ๋ฅ
๋ฐฉํฅ ๋น์ํ ๊ทธ๋ํ, ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ๊ทธ๋ํ ์ด๋ก , ์์ ์ ๋ ฌ
์ ์ถ ์ผ์
2024๋ 3์ 8์ผ 14:17:09
๋ฌธ์ ์ค๋ช
์๊ธฐ 2012๋ ! ๋๋์ด 2๋ ๊ฐ ์๋ง์ ๊ตญ๋ฏผ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ๊ฒ์ ACM Craft (Association of Construction Manager Craft)๊ฐ ๋ฐ๋งค๋์๋ค.
์ด ๊ฒ์์ ์ง๊ธ๊น์ง ๋์จ ๊ฒ์๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ACMํฌ๋ํํธ๋ ๋ค์ด๋๋ฏนํ ๊ฒ์ ์งํ์ ์ํด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ ํด์ ธ ์์ง ์๋ค. ์ฆ, ์ฒซ ๋ฒ์งธ ๊ฒ์๊ณผ ๋ ๋ฒ์งธ ๊ฒ์์ด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ๋ค๋ฅผ ์๋ ์๋ค. ๋งค ๊ฒ์์์ ์ ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ฃผ์ด์ง๋ค. ๋ํ ๋ชจ๋ ๊ฑด๋ฌผ์ ๊ฐ๊ฐ ๊ฑด์ค์ ์์ํ์ฌ ์์ฑ์ด ๋ ๋๊น์ง Delay๊ฐ ์กด์ฌํ๋ค.
์์ ์์๋ฅผ ๋ณด์.
์ด๋ฒ ๊ฒ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฑด์ค ์์ ๊ท์น์ด ์ฃผ์ด์ก๋ค. 1๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์ค์ด ์๋ฃ๋๋ค๋ฉด 2๋ฒ๊ณผ 3๋ฒ์ ๊ฑด์ค์ ์์ํ ์ ์๋ค. (๋์์ ์งํ์ด ๊ฐ๋ฅํ๋ค) ๊ทธ๋ฆฌ๊ณ 4๋ฒ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด์๋ 2๋ฒ๊ณผ 3๋ฒ ๊ฑด๋ฌผ์ด ๋ชจ๋ ๊ฑด์ค ์๋ฃ๋์ด์ผ์ง๋ง 4๋ฒ๊ฑด๋ฌผ์ ๊ฑด์ค์ ์์ํ ์ ์๋ค.
๋ฐ๋ผ์ 4๋ฒ๊ฑด๋ฌผ์ ๊ฑด์ค์ ์๋ฃํ๊ธฐ ์ํด์๋ ์ฐ์ ์ฒ์ 1๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์คํ๋๋ฐ 10์ด๊ฐ ์์๋๋ค. ๊ทธ๋ฆฌ๊ณ 2๋ฒ ๊ฑด๋ฌผ๊ณผ 3๋ฒ ๊ฑด๋ฌผ์ ๋์์ ๊ฑด์คํ๊ธฐ ์์ํ๋ฉด 2๋ฒ์ 1์ด๋ค์ ๊ฑด์ค์ด ์๋ฃ๋์ง๋ง ์์ง 3๋ฒ ๊ฑด๋ฌผ์ด ์๋ฃ๋์ง ์์์ผ๋ฏ๋ก 4๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์คํ ์ ์๋ค. 3๋ฒ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ณ ๋๋ฉด ๊ทธ๋ 4๋ฒ ๊ฑด๋ฌผ์ ์ง์์ ์์ผ๋ฏ๋ก 4๋ฒ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ธฐ๊น์ง๋ ์ด 120์ด๊ฐ ์์๋๋ค.
ํ๋ก๊ฒ์ด๋จธ ์ต๋ฐฑ์ค์ ์ ์ธ๊ณผ์ ๋ฐ์ดํธ ๋น์ฉ์ ๋ง๋ จํ๊ธฐ ์ํด ์๊ฐ๋ํ๊ต๋ฐฐ ACMํฌ๋ํํธ ๋ํ์ ์ฐธ๊ฐํ๋ค! ์ต๋ฐฑ์ค์ ํ๋ คํ ์ปจํธ๋กค ์ค๋ ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฝ๊ธฐ์์ ํน์ ๊ฑด๋ฌผ๋ง ์ง๋๋ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒ์์์ ์ด๊ธธ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋งค ๊ฒ์๋ง๋ค ํน์ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํ ์์๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์ต๋ฐฑ์ค์ ์ข์ ํ๊ณ ์์๋ค. ๋ฐฑ์ค์ด๋ฅผ ์ํด ํน์ ๊ฑด๋ฌผ์ ๊ฐ์ฅ ๋นจ๋ฆฌ ์ง์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์์๊ฐ์ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ฃผ์.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ํ ์คํธ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค. ์ฒซ์งธ ์ค์ ๊ฑด๋ฌผ์ ๊ฐ์ N๊ณผ ๊ฑด๋ฌผ๊ฐ์ ๊ฑด์ค์์ ๊ท์น์ ์ด ๊ฐ์ K์ด ์ฃผ์ด์ง๋ค. (๊ฑด๋ฌผ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ์กด์ฌํ๋ค)
๋์งธ ์ค์๋ ๊ฐ ๊ฑด๋ฌผ๋น ๊ฑด์ค์ ๊ฑธ๋ฆฌ๋ ์๊ฐ D1, D2, ..., DN์ด ๊ณต๋ฐฑ์ ์ฌ์ด๋ก ์ฃผ์ด์ง๋ค. ์ ์งธ ์ค๋ถํฐ K+2์ค๊น์ง ๊ฑด์ค์์ X Y๊ฐ ์ฃผ์ด์ง๋ค. (์ด๋ ๊ฑด๋ฌผ X๋ฅผ ์ง์ ๋ค์์ ๊ฑด๋ฌผ Y๋ฅผ ์ง๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค)
๋ง์ง๋ง ์ค์๋ ๋ฐฑ์ค์ด๊ฐ ์น๋ฆฌํ๊ธฐ ์ํด ๊ฑด์คํด์ผ ํ ๊ฑด๋ฌผ์ ๋ฒํธ W๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๊ฑด๋ฌผ W๋ฅผ ๊ฑด์ค์๋ฃ ํ๋๋ฐ ๋๋ ์ต์ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ํธ์์ ๊ฑด๋ฌผ์ ์ง๋ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ๋ฐ๋ ์๊ฐ์ด ์์๋์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ค.
๊ฑด์ค์์๋ ๋ชจ๋ ๊ฑด๋ฌผ์ด ๊ฑด์ค ๊ฐ๋ฅํ๋๋ก ์ฃผ์ด์ง๋ค.
๐ํ์ด
์์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ ๋ฌธ์ ์ด๋ค.
์์์ ๋ ฌ์ ๋ํด์ ๊ณต๋ถ๋ฅผ ํ๋๋ฐ ์์์ ๋ ฌ์ ์ผ์ ์์๋ฅผ ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์์ ๋ฌธ์ ์์ ์์๋ฅผ ๋ณด๋ฉด ์ผ์ ์์๊ฐ 1 -> 2 -> 3 -> 4 ์ธ ๊ฒ์ ์ ์์๋๋ฐ ์ด๋ ๊ฒ ์ผ์ ์์๋ฅผ ์ ํ๊ฒ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ง์ ์ฐจ์์ ๊ฐ๋ ์ ์๊ณ ์์ด์ผํ๋ค.
์ง์ ์ฐจ์๋ ๊ทธ๋ํ์์ ๋ ธ๋๋ก ๋ค์ด์ค๋ ๊ฐ์ ์ ๊ฐ์๋ก ์์ ์์์์๋ 1 ์ ์ง์ ์ฐจ์๊ฐ 0, 2๋ ์ง์ ์ฐจ์๊ฐ 1, 3์ ์ง์ ์ฐจ์๊ฐ 1, 4๋ ์ง์ ์ฐจ์๊ฐ 2์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ผ์ ์์๋ฅผ ์ ํ๊ธฐ ์ํด์ ํ๋ฅผ ์ฌ์ฉํ๋ค.
๋จผ์ ํ์ ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ฅผ ๋ค ๋ฃ๋๋ค.
๊ทธ ํ ํ๊ฐ ๋น ๋ ๊น์ง ์งํํ๋ฉด์ ํ๋ฅผ ๋ฝ๋๋ค.
์ฐ๊ฒฐ๋ ๋ ธ๋์ ์ง์ ์ฐจ์๋ฅผ ์ค์ฌ๋๊ฐ๊ธฐ ์์ํ๋๋ฐ ์ด๋ ์ง์ ์ฐจ์๊ฐ 0์ด ๋๋ฉด ํ์ ๋ฃ๋๋ค.
์ด๋ ๊ฒ ๋ฐ๋ณตํ๋ฉด ์ผ์ ์์๊ฐ ์์ฑ๋๋ค.
๋ง์ฝ ์ฌ์ดํด์ด ๋ฐ์ํ๋ฉด ์์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์๊ฐ ์๋ค.
์์์ ๋ ฌ ๊ณต๋ถ๋ ์ด๋ ๊ฒ ๋๋๊ณ ๋ฌธ์ ๋ฅผ ํธ๋๊ฑด ๋ค๋ฅธ ๋ฌธ์ ๋๊น..
์ด ๋ฌธ์ ๋ DP๊ฐ ์์ธ? ๋ฌธ์ ์ด๋ค.
๊ฑด๋ฌผ ๊ฑด์ค ๋น์ฉ์ cost๋ฐฐ์ด๋ก ์ ์ฅํ๊ณ , ๊ฐ ๊ฑด๋ฌผ์ ์ง๋๋ฐ ์ต์ ๋น์ฉ์ ์ ์ฅํ๋ ๋ฐฐ์ด์ result๋ฐฐ์ด๋ก ์ ์ฅํ๋ค.
result๋ฐฐ์ด์ ํ์ ์ฝ๋์์ result[next] = max(result[next], result[here] + cost[next]);
์ด๋ ๊ฒ dp๋ฅผ ์ด์ฉํ๋ค.
์ ์ญ๋ณ์๋ solveํจ์๋ฅผ ๋ถ์ํด๋ณด์!
์ฃผ์์ ์ฝ๋๋ฅผ ๋ค์ ์๊ฐํ๊ธฐ
int t, n, k; // ํ
์คํธ ์ผ์ด์ค, ๊ฑด๋ฌผ ๊ฐ์, ๊ฐ์ ๊ฐ์
vector<vector<int>> graph; // ๊ทธ๋ํ
vector<int> cost, degree; // ์๊ฐ ๋น์ฉ, ์ง์
์ฐจ์
void solve()
{
cin >> t;
for (int i = 0; i < t; ++i)
{
// ๊ฐ ์ ์ญ๋ณ์ ์ด๊ธฐํ ์ํค๊ธฐ
graph.clear();
cost.clear();
degree.clear();
// ๊ฑด๋ฌผ์ ๊ฐ์, ๊ฐ์ ๊ฐ์ ์
๋ ฅ ๋ฐ๊ธฐ
cin >> n >> k;
graph.resize(1010);
cost = vector<int>(n + 1);
degree = vector<int>(n + 1);
// ๊ฑด๋ฌผ ๋น์ฉ ์
๋ ฅ ๋ฐ๊ธฐ
for (int j = 0; j < n; ++j)
cin >> cost[j + 1];
// ๊ฐ์ ์
๋ ฅ ๋ฐ๊ธฐ
int u, v;
for (int j = 0; j < k; ++j)
{
cin >> u >> v;
// ์ง์
์ฐจ์ ๊ณ์ฐํ๊ธฐ
degree[v]++;
graph[u].push_back(v);
}
// ๋ชฉํ ๊ฑด๋ฌผ
int target;
cin >> target;
// ๊ฐ ๊ฑด๋ฌผ์ ์ต์ ๊ฑด์ค ๋น์ฉ์ ์ ์ฅํ๋ ๋ฐฐ์ด
int result[1010];
queue<int> q;
for (int j = 1; j <= n; ++j)
{
// ์ง์
์ฐจ์๊ฐ 0์ด๋ผ๋ฉด q์ push
if (degree[j] == 0)
q.push(j);
// ๊ฐ ์ต์ ๋น์ฉ์ ์๊ธฐ ์์ ์ ๊ฑด์ค ๋น์ฉ์ ๋ํด์ค์ผํจ.
result[j] = cost[j];
}
while (q.empty() == false)
{
int here = q.front();
q.pop();
for (int j = 0; j < graph[here].size(); ++j)
{
int next = graph[here][j];
// here๊ฐ ์ฌ๋ผ์ก์ผ๋ ์ง์
์ฐจ์๊ฐ ๊ฐ์ํ๋ค.
degree[next]--;
// result๋ ๊ฐฑ์ ๋๋ ๊ฐ ์ค ์ต๋๊ฐ์ผ๋ก ํด์ผํ๋ค.
result[next] = max(result[next], result[here] + cost[next]);
// ์ง์
์ฐจ์๊ฐ 0์ด ๋ ๋
ธ๋๊ฐ ์๋ค๋ฉด q์ push
if (degree[next] == 0)
q.push(next);
}
}
// ์ ๋ต ์ถ๋ ฅ
cout << result[target] << '\n';
}
}
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
using namespace std;
// ACM Craft
// ์์ ์ ๋ ฌ
int t, n, k;
vector<vector<int>> graph;
vector<int> cost, degree;
void solve()
{
cin >> t;
for (int i = 0; i < t; ++i)
{
graph.clear();
cost.clear();
degree.clear();
cin >> n >> k;
graph.resize(1010);
cost = vector<int>(n + 1);
degree = vector<int>(n + 1);
for (int j = 0; j < n; ++j)
cin >> cost[j + 1];
int u, v;
for (int j = 0; j < k; ++j)
{
cin >> u >> v;
degree[v]++;
graph[u].push_back(v);
}
int target;
cin >> target;
int result[1010];
queue<int> q;
for (int j = 1; j <= n; ++j)
{
if (degree[j] == 0)
q.push(j);
result[j] = cost[j];
}
while (q.empty() == false)
{
int here = q.front();
q.pop();
for (int j = 0; j < graph[here].size(); ++j)
{
int next = graph[here][j];
degree[next]--;
result[next] = max(result[next], result[here] + cost[next]);
if (degree[next] == 0)
q.push(next);
}
}
cout << result[target] << '\n';
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}