출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]
https://www.acmicpc.net/problem/2668
2668번: 숫자고르기
세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절�
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 100 + 1;
int N, cnt;
int want[MAX];
bool visited[MAX];
vector<int> v;
bool done[MAX]; //방문이 끝났는지 여부
int numCycle;
void DFS(int nodeNum)
{
visited[nodeNum] = true;
int next = want[nodeNum];
if (!visited[next])
DFS(next);
//이미 방문했지만 방문이 끝난 노드가 아니라면 사이클
else if (!done[next])
{
//팀원을 모두 센다
int i = next;
v.push_back(i);
while (i != nodeNum)
{
i = want[i];
v.push_back(i);
}
}
done[nodeNum] = true; //더 이상 해당 노드를 방문할 일이 없다
}
int main(void)
{
cin >> N;
for (int j = 1; j <= N; j++)
cin >> want[j];
cnt = 0;
for (int j = 1; j <= N; j++)
if (!visited[j])
DFS(j); //팀을 이루는 사람들을 센다
sort(v.begin(), v.end());
cout << v.size() << "\n";
for (int i = 0; i < v.size(); i++)
cout << v[i] << "\n";
return 0;
}
cycle 문제를 최근에 풀어봤어서 이 문제가 cycle문제인지 또, 어떻게 풀어야 하는지 금방 알 수 있었다.
하지만, 만약에 좀 시간이 지난 다음 이 문제를 보았을 때 cycle문제임을 깨달을 수 있을까...?
백준 1613 역사(floyd-warshall) (0) | 2020.08.04 |
---|---|
백준 9205 맥주 마시면서 걸어가기(dfs) (0) | 2020.08.04 |
백준 6593 상범 빌딩(bfs) (0) | 2020.08.02 |
백준 1325 효율적인 해킹(dfs, bfs) (0) | 2020.08.02 |
백준 11559 Puyo Puyo(dfs) (0) | 2020.08.01 |
댓글 영역