BOJ 1516. ๊ฒ์ ๊ฐ๋ฐ
๐โโ๏ธ[Gold III] ๊ฒ์ ๊ฐ๋ฐ - 1516
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2552 KB, ์๊ฐ: 36 ms
๋ถ๋ฅ
๋ฐฉํฅ ๋น์ํ ๊ทธ๋ํ, ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ๊ทธ๋ํ ์ด๋ก , ์์ ์ ๋ ฌ
์ ์ถ ์ผ์
2023๋ 12์ 17์ผ 21:11:47
๋ฌธ์ ์ค๋ช
์ ํ์ฌ์์ ์ด๋ฒ์ ์๋ก์ด ์ ๋ต ์๋ฎฌ๋ ์ด์ ๊ฒ์ ์ธ์ค ํฌ๋ํํธ๋ฅผ ๊ฐ๋ฐํ๊ธฐ๋ก ํ์๋ค. ํต์ฌ์ ์ธ ๋ถ๋ถ์ ๊ฐ๋ฐ์ด ๋๋ ์ํ๊ณ , ์ข ์กฑ๋ณ ๊ท ํ๊ณผ ์ ์ฒด ๊ฒ์ ์๊ฐ ๋ฑ์ ์กฐ์ ํ๋ ๋ถ๋ถ๋ง ๋จ์ ์์๋ค.
๊ฒ์ ํ๋ ์ด์ ๋ค์ด๊ฐ๋ ์๊ฐ์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ๊ฑด๋ฌผ์ ์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์์ ์๊ฐ์ ์ด์ฉํ์ฌ ๊ทผ์ฌํ๊ธฐ๋ก ํ์๋ค. ๋ฌผ๋ก , ์ด๋ค ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด์ ๋ค๋ฅธ ๊ฑด๋ฌผ์ ๋จผ์ ์ง์ด์ผ ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋จ์ํ์ง๋ง์ ์์ ์๋ ์๋ค. ์๋ฅผ ๋ค๋ฉด ์คํํฌ๋ํํธ์์ ๋ฒ์ปค๋ฅผ ์ง๊ธฐ ์ํด์๋ ๋ฐฐ๋ญ์ ๋จผ์ ์ง์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ฐฐ๋ญ์ ๋จผ์ ์ง์ ๋ค ๋ฒ์ปค๋ฅผ ์ง์ด์ผ ํ๋ค. ์ฌ๋ฌ ๊ฐ์ ๊ฑด๋ฌผ์ ๋์์ ์ง์ ์ ์๋ค.
ํธ์์ ์์์ ๋ฌดํํ ๋ง์ด ๊ฐ์ง๊ณ ์๊ณ , ๊ฑด๋ฌผ์ ์ง๋ ๋ช ๋ น์ ๋ด๋ฆฌ๊ธฐ๊น์ง๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์๋๋ค๊ณ ๊ฐ์ ํ์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฑด๋ฌผ์ ์ข ๋ฅ ์ N(1 โค N โค 500)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ๊ฑด๋ฌผ์ ์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ๊ทธ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด ๋จผ์ ์ง์ด์ ธ์ผ ํ๋ ๊ฑด๋ฌผ๋ค์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ๊ฑด๋ฌผ์ ๋ฒํธ๋ 1๋ถํฐ N๊น์ง๋ก ํ๊ณ , ๊ฐ ์ค์ -1๋ก ๋๋๋ค๊ณ ํ์. ๊ฐ ๊ฑด๋ฌผ์ ์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋ชจ๋ ๊ฑด๋ฌผ์ ์ง๋ ๊ฒ์ด ๊ฐ๋ฅํ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
N๊ฐ์ ๊ฐ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
</br>
๐ํ์ด
๋ฌธ์ ๋ ์ดํดํ๋๋ฐ ๊ฑฐ์ ๋ค ํ๊ฑฐ๊ฐ์๋ฐ ์ํ๋ฆผ.
๊ฐ ์ผ์ด์ค์์ ๊ฐ์ฅ ์ต์์ ๊ฐ์ ๋ค๊ณ ์์ด์ผํ๋๋ฐ ์ ์๋จ.
์ ์ฅํ๊ณ ๋ค์์ ํ์ด์ผ๊ฒ ๋ค.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
/*
๊ทธ๋ํ ๋ฌธ์ ์
์์๋ฒ๋ ธ๋ค
๋งจ ์ ์ซ์๋ ์ ์ ์ ์ ๋ณด
๊ทธ๋ค์์ ๋์ค๋๊ฑด ๊ฐ์ ์ ๋ณด์
5
10 -1
10 1 -1
4 1 -1
4 3 1 -1
3 3 -1
*/
int n;
vector<vector<int>> seq;
vector<bool> discovered;
int result[510];
void setting()
{
cin >> n;
seq = vector<vector<int>>(n + 1, vector<int>(n + 1, -1));
discovered = vector<bool>(n + 1, false);
int temp;
for (int i = 1; i <= n; ++i)
{
cin >> temp;
seq[i][0] = temp;
//result[i] = temp;
while (true)
{
cin >> temp;
if (temp == -1)
break;
seq[i][temp] = 1;
}
}
}
int bfs(int here)
{
int want = here;
discovered = vector<bool>(n + 1, false);
int res = 0;
queue<int> q;
q.push(here);
discovered[here] = true;
while (q.empty() == false)
{
here = q.front();
q.pop();
res += seq[here][0];
for (int there = 1; there <= n; ++there)
{
if (seq[here][there] == -1)
continue;
if (discovered[there])
continue;
//int next = seq[here][there];
//result[next] = max(result[next], result[here] + seq[next][0]);
q.push(there);
discovered[there] = true;
}
}
return res;
}
// ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์
// ๋ฉ๋ชจ์ด์ ์ด์
์ ํ์
int cache[502];
void solve()
{
for (int i = 1; i <= n; ++i)
{
cache[i] = bfs(i);
}
for (int i = 1; i <= n; ++i)
{
int res = 0;
for (int j = 1; j <= n; ++j)
{
if (seq[i][j] != -1)
{
res = max(res, cache[j]);
}
}
res += seq[i][0];
cout << res << '\n';
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}