상세 컨텐츠

λ³Έλ¬Έ 제λͺ©

[λ°±μ€€(BOJ)] 10451번: μˆœμ—΄ 사이클 (DFS/BFS, C++)

PROGRAMMING/Algorithm

by koharin 2021. 2. 25. 17:19

λ³Έλ¬Έ

728x90
λ°˜μ‘ν˜•

πŸ“ λ¬Έμ œν’€μ΄ κ³Όμ •


μˆœμ—΄ 사이클은 μ‹œμž‘ ν›„ 자기 μžμ‹ μœΌλ‘œ λ‹€μ‹œ λŒμ•„μ˜¨λ‹€.

1 2 3 4 5 6 7 8
3 2 7 8 1 4 5 6

주어진 μ˜ˆμ‹œλ₯Ό 보면, indexλ§ˆλ‹€ 값이 μ£Όμ–΄μ§€λŠ”λ°, 각 μΈλ±μŠ€μ—μ„œ κ°’μ˜ λ°©ν–₯으둜 간선이 μ‘΄μž¬ν•œλ‹€.

μ΄κ²ƒμœΌλ‘œ κ·Έλž˜ν”„μ˜ 연결성을 λ‚˜νƒ€λ‚Ό 수 있고, 1 -> 3, 3 -> 7, 7 -> 5, 5 -> 1둜 1둜 μ‹œμž‘ν•΄μ„œ 1둜 λ‹€μ‹œ λŒμ•„μ˜€λ―€λ‘œ μˆœμ—΄ 사이클에 ν•΄λ‹Ήν•œλ‹€.

2의 κ²½μš°μ—λ„ 2μ—μ„œ μ‹œμž‘ν•΄μ„œ 2둜 λλ‚˜λ―€λ‘œ ν•˜λ‚˜μ˜ μˆœμ—΄ 사이클이닀.

4 -> 8 -> 6 -> 4μ΄λ―€λ‘œ 이 κ²½μš°μ—λ„ ν•˜λ‚˜μ˜ μˆœμ—΄ μ‚¬μ΄ν΄λ‘œ, 이 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ—λŠ” 총 3개의 μˆœμ—΄ 사이클이 μ‘΄μž¬ν•œλ‹€.

λ°©ν–₯ κ·Έλž˜ν”„μ΄κ³ , λͺ¨λ“  정점이 μ—°κ²°λ˜μ–΄ μžˆμ§„ μ•ŠμœΌλ―€λ‘œ λͺ¨λ“  μΈλ±μŠ€μ— λŒ€ν•΄ λ°©λ¬Έν•˜μ§€ μ•Šμ•˜μœΌλ©΄ BFS둜 λ°©λ¬Έν•΄μ„œ νƒμƒ‰ν•˜λ„λ‘ ν•œλ‹€.

이미 λ°©λ¬Έ ν–ˆκ³ , current와 μΈμ ‘ν•œ next 정점이 초기 정점 (start)와 λ™μΌν•˜λ‹€λ©΄ μˆœμ—΄ 사이클에 ν•΄λ‹Ήν•˜λ―€λ‘œ countλ₯Ό μ¦κ°€ν•˜κ³  λ¦¬ν„΄ν•œλ‹€.

#include <stdio.h>
#include <deque>
#include <queue>
using namespace std;

void BFS(int start, deque<int> *graph, int *visited, int *count){
    queue<int> q;
    visited[start] = true;
    q.push(start);
    printf("[+] %d visited\n", start);

    while(!q.empty()){
        int current = q.front();
        q.pop();
        for(int next: graph[current]){
            if(visited[next] == false){
                visited[next] = true;
                q.push(next);
                printf("[+] %d visited\n", next);
            }
            else if(visited[next] == true && next == start){
                (*count)++; // 이미 λ°©λ¬Έν–ˆκ³ , μΈμ ‘ν•œ 정점이 처음 λ°©λ¬Έν•œ 정점이면 μ‚¬μ΄ν΄μ΄λ―€λ‘œ μΉ΄μš΄νŒ…
                printf("[+] %d visited count: %d\n", next, *count);
                return;
            }
        }
    }
    

}

int main(){
    int T;
    scanf("%d", &T);

    for(int i=0; i<T; i++){
        int N, count=0;
        scanf("%d", &N);
        deque<int> graph[N+1];
        int visited[N+1];
        fill(visited, visited+N+1, false);

        for(int j=1; j<=N; j++){
            int num; scanf("%d", &num);
            graph[j].push_back(num);
        }
        for(int j=1; j<=N; j++){
            printf("graph[%d]: ", j);
            for(int n: graph[j]) printf("%d ", n);
            printf("\n");
        }
        for(int j=1; j<=N; j++){
            if(visited[j] == false) BFS(j, graph, visited, &count);
        }
        printf("%d\n", count);
    }
}

 

 

πŸ’» C++ μ œμΆœμ½”λ“œ


#include <bits/stdc++.h>
using namespace std;

void BFS(int start, deque<int> *graph, int *visited, int *count){
    queue<int> q;
    visited[start] = true;
    q.push(start);

    while(!q.empty()){
        int current = q.front();
        q.pop();
        for(int next: graph[current]){
            if(visited[next] == false){
                visited[next] = true;
                q.push(next);
            }
            else if(visited[next] == true && next == start){
                (*count)++; // 이미 λ°©λ¬Έν–ˆκ³ , μΈμ ‘ν•œ 정점이 처음 λ°©λ¬Έν•œ 정점이면 μ‚¬μ΄ν΄μ΄λ―€λ‘œ μΉ΄μš΄νŒ…
                return;
            }
        }
    }
    

}

int main(){
    int T;
    scanf("%d", &T);

    for(int i=0; i<T; i++){
        int N, count=0;
        scanf("%d", &N);
        deque<int> graph[N+1];
        int visited[N+1];
        fill(visited, visited+N+1, false);

        for(int j=1; j<=N; j++){
            int num; scanf("%d", &num);
            graph[j].push_back(num);
        }

        for(int j=1; j<=N; j++){
            if(visited[j] == false) BFS(j, graph, visited, &count);
        }
        printf("%d\n", count);
    }
}

 

 

πŸ‘ κ²°κ³Ό


728x90
λ°˜μ‘ν˜•

κ΄€λ ¨κΈ€ 더보기