Hoon222y

[BOJ 9466] 텀 프로젝트 본문

코딩/BOJ & 알고스팟

[BOJ 9466] 텀 프로젝트

hoon222y 2017. 6. 18. 14:08

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

dfs의 사이클을 체크하여 사이클의 경우 dfs를 돌리지 않고 최적화 하는 방법으로 시간을 줄이는 문제이다. 


찬란한 오답 퍼레이드 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

dfs상에서 사이클을 체크하는 방법은 아직 끝나지 않았지만 visit된 정점을 방문할경우 사이클이 존재한다고 생각하는 것이다. 


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
44
45
46
47
48
49
50
51
52
53
54
#include<iostream>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<utility>
#include<vector>
#include<cstring>
#include<queue>
#include<cmath>
#include<math.h>
 
using namespace std;
 
int par[100100];
int t, n, arr[100100], res;
int visited[100010];
int finish[100010];
void cycle(int v, int p){
    res++;
    if (v == p){
        return;
    }
    cycle(par[v], p);
}
void dfs(int v){
    visited[v] = true;
    if (!visited[arr[v]]){
        par[arr[v]] = v;
        dfs(arr[v]);
    }else if (!finish[arr[v]]){  //방문은 되었으나 finisi함수가 되지 않았으면 사이클 체크가 되어있지 않다면
        cycle(v, arr[v]);
    }
    finish[v] = true;
}
int main(){
    scanf("%d"&t);
    while (t--){
        memset(par, -1sizeof(par));
        memset(visited, 0sizeof(visited));
        memset(finish, 0sizeof(finish));
        res = 0;
        scanf("%d"&n);
        for (int i = 1; i <= n; i++){
            scanf("%d"&arr[i]);
        }
        for (int i = 1; i <= n; i++){
            if (!visited[i]){
                dfs(i);
            }
        }
        printf("%d\n", n - res);
    }
    return 0;
}
cs


http://blog.naver.com/PostView.nhn?blogId=kks227&logNo=220785731077

갓퍼마리오님의 설명을 참고한다면 더 쉽게 접근할 수 있을것이다. 

'코딩 > BOJ & 알고스팟' 카테고리의 다른 글

[BOJ 12869] 뮤탈리스크  (0) 2017.06.18
[BOJ 2110] 공유기 설치  (0) 2017.06.18
[BOJ 1300] K번째 수  (0) 2017.06.15
[BOJ 1194] 달이 차오른다, 가자.  (1) 2017.06.15
[BOJ 14614] Calculate!  (3) 2017.05.30
Comments