๐ฟ ๋ฌธ์
2668๋ฒ: ์ซ์๊ณ ๋ฅด๊ธฐ
์ธ๋ก ๋ ์ค, ๊ฐ๋ก๋ก N๊ฐ์ ์นธ์ผ๋ก ์ด๋ฃจ์ด์ง ํ๊ฐ ์๋ค. ์ฒซ์งธ ์ค์ ๊ฐ ์นธ์๋ ์ ์ 1, 2, …, N์ด ์ฐจ๋ก๋๋ก ๋ค์ด ์๊ณ ๋์งธ ์ค์ ๊ฐ ์นธ์๋ 1์ด์ N์ดํ์ธ ์ ์๊ฐ ๋ค์ด ์๋ค. ์ฒซ์งธ ์ค์์ ์ซ์๋ฅผ ์ ์ ํ ๋ฝ์ผ๋ฉด, ๊ทธ ๋ฝํ ์ ์๋ค์ด ์ด๋ฃจ๋ ์งํฉ๊ณผ, ๋ฝํ ์ ์๋ค์ ๋ฐ๋ก ๋ฐ์ ๋์งธ ์ค์ ๋ค์ด์๋ ์ ์๋ค์ด ์ด๋ฃจ๋ ์งํฉ์ด ์ผ์นํ๋ค. ์ด๋ฌํ ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋๋ก ์ ์๋ค์ ๋ฝ๋, ์ต๋๋ก ๋ง์ด ๋ฝ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์๋ฅผ ๋ค์ด, N=7์ธ ๊ฒฝ์ฐ ์๋
www.acmicpc.net
๐ฟ ํด๊ฒฐ ๋ฐฉ๋ฒ
directed graph์์ cycle์ ๊ฐ์์ cycle์ ๊ตฌ์ฑํ๋ ๋ ธ๋๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์ด๊ฒ๋.... ํ์ฐธ ํด๋ณด๋ค๊ฐ ๊ฒฐ๊ตญ ๊ตฌ๊ธ๋ง์ ํ๊ธด ํ๋ค....
dfs์ ๋งค๊ฐ๋ณ์๋ก ์์ํ๋ ๋ ธ๋์ ํ์ฌ๋ ธ๋๋ฅผ ์ ๋ฌํ ํ,
ํ์ฌ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธํ์ ์ด ์์ผ๋ฉด์ ํ์ฌ ๋ ธ๋์ ์์๋ ธ๋๊ฐ ๊ฐ์ ๊ฒฝ์ฐ cycle์ด๋ค.
๋ฐ๋ผ์ ์ด๋ answer ๋ฐฐ์ด์ ํ์ฌ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค!
ํ์ฌ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด ํ์ฌ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์(visited[current]++;) ํด์ฃผ๊ณ
๋ค์ dfs๋ฅผ ๋๋ ค์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ 26~28์ค์ ์ด๊ธฐํ...
์ด๊ฒ ๋๋ฌธ์ ๊ณ์ ํ๋ ธ๋ค๊ณ ๋ด์๋คใ ใ ...
๐ฟ ๋ด ์ฝ๋(C++)
// [2668] ์ซ์๊ณ ๋ฅด๊ธฐ
// https://www.acmicpc.net/problem/2668
// dfs
// cycle ๊ฐ์ ์ฐพ๊ธฐ!
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
void dfs(int, int);
int visited[102] = { 0 };
int a[102];
vector<int> answer;
int main(void)
{
int n;
scanf_s("%d", &n);
for (int i = 1; i <= n; i++) {
scanf_s("%d", &a[i]);
}
for (int i = 1; i <= n; i++) {
dfs(i, i);
// ***initialization***
for (int j = 1; j <= n; j++)
visited[j] = 0;
}
printf("%d\n", answer.size());
for (int i = 0; i < answer.size(); i++) {
printf("%d\n", answer[i]);
}
}
void dfs(int start, int current)
{
if (visited[current]) {
// cycle์ธ ๊ฒฝ์ฐ
if (current == start) {
answer.push_back(start);
}
}
else {
visited[current]++;
dfs(start, a[current]);
}
}
'Baekjoon > DFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[11724] ์ฐ๊ฒฐ ์์์ ๊ฐ์ (0) | 2020.06.23 |
---|---|
[4963] ์ฌ์ ๊ฐ์(C++) (0) | 2020.05.19 |
[1012] ์ ๊ธฐ๋ ๋ฐฐ์ถ (0) | 2019.07.22 |
[2667] ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ(C) (0) | 2019.07.15 |
[2606] ๋ฐ์ด๋ฌ์ค (0) | 2019.07.14 |