https://www.acmicpc.net/problem/2668



두 집합이 일치하는지의 문제로 사이클이 존재하는 것들을 최대로 뽑으면 되는 문제이다.


N이 100밖에 안되기 때문에

모든 인자에 대하여 사이클 여부를 확인하는 식으로 진행해도 시간초과가 발생하지 않는다고 생각했다.


이전에 올린 9466번 텀 프로젝트와 유사하지만(사이클 문제)

N제한이 달라서 이번 문제가 더욱 수월하게 풀 수 있었다.


dfs로 방문을 할 수 있도록 했고 매개변수로는 처음 방문을 시작한 노드와 현재 방문중인 노드로 함수를 구현했다.

만약 방문을 한 적이 있고, 처음 시작한 노드와 같다면 사이클을 통해 다시 왔다는 것이기 때문에

해당 노드는 사이클이 존재한다고 판단하고 정답을 구할 수 있도록 했다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <vector>
using namespace std;
 
int N;
vector<int> vec;
vector<int> visited;
vector<int> ans;
void dfs(int startNode,int currentNode){
    
    if(visited[currentNode]){
        if(currentNode==startNode)
            ans.push_back(startNode);
    }else{
        visited[currentNode]++;
        dfs(startNode,vec[currentNode]);
    }
    
}
int main(){
    
    cin>>N;
    
    vec=vector<int> (N+1,0);
    visited=vector<int> (N+1,0);
 
    for(int i=1;i<=N;i++){
        scanf("%d",&vec[i]);
    }
    
    for(int i=1;i<=N;i++){
        dfs(i,i);
        visited=vector<int> (N+1,0); //초기화
    }
    
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++){
        cout<<ans[i]<<endl;
    }
    
    return 0;
}
 
cs


'알고리즘(BOJ) > DFS' 카테고리의 다른 글

백준 17136번 - 색종이 붙이기  (0) 2019.04.14
백준 14502번 - 연구소  (0) 2019.03.30
백준 15686번 - 치킨 배달  (0) 2018.10.15
백준 15683번 - 감시  (0) 2018.10.11
백준 1325번 - 효율적인 해킹  (2) 2018.04.02

+ Recent posts