๐Ÿ™‡โ€โ™€๏ธ[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';
	}
}

image

๐Ÿš€์ „์ฒด ์ฝ”๋“œ

#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;
}

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: