์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋ฐฑ์ค€(BOJ)] 2644๋ฒˆ: ์ดŒ์ˆ˜๊ณ„์‚ฐ (DFS/BFS, C++)

PROGRAMMING/Algorithm

by koharin 2021. 2. 8. 18:06

๋ณธ๋ฌธ

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ป C++ ์ œ์ถœ์ฝ”๋“œ


#include <stdio.h>
#include <deque>
#include <queue>
#include <algorithm>

using namespace std;
int BFS(int target1, int target2, deque<int> *graph, bool *visited, deque<int> *child){
    queue<int> q;
    visited[target1] = true; // check visited
    q.push(target1);
    (*child)[target1] = 0;
    while(!q.empty()){
        int current = q.front(); // get front element from queue

        q.pop(); // pop front element
        for(int num: graph[current]){
            if(visited[num] == false){
                q.push(num);
                visited[num] = true;
                (*child)[num] = (*child)[current] + 1;

                if(num == target2) return (*child)[num];
            }
        }
    }
    return -1; //queue๊ฐ€ empty๊ฐ€ ๋˜์–ด๋„ num == target2์ธ ์กฐ๊ฑด์ด ์—†์–ด์„œ ๋ฆฌํ„ดํ•˜์ง€ ๋ชปํ•จ == target2 ์ฐพ์ง€ ๋ชปํ•จ == target2๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์Œ
}

int main(){
    int n, m, target1, target2; // n: # of nodes, m: # of edges

    scanf("%d", &n);
    scanf("%d %d", &target1, &target2);
    scanf("%d", &m);

    deque<int> graph[n];
    deque<int> child[n]; // parent - child
    bool visited[n]; // check if visited

    fill(visited, visited+n, false);

    for(int i=0; i<m; i++)
    {
        int u,v, result; 

        scanf("%d %d", &u, &v);

        graph[u-1].push_back(v-1);
        graph[v-1].push_back(u-1);
    }

    int result = BFS(target1-1, target2-1, graph, visited, child);

    printf("%d\n", result);
}

 

 

๐Ÿ“ ๋ฌธ์ œํ’€์ด ๊ณผ์ •


#include <stdio.h>
#include <deque>
#include <queue>
#include <algorithm>

using namespace std;
int BFS(int target1, int target2, deque<int> *graph, bool *visited, deque<int> *child){
    queue<int> q;
    visited[target1] = true; // check visited
    printf("[+] %d VISITED\n", target1);
    q.push(target1);
    (*child)[target1] = 0;
    while(!q.empty()){
        int current = q.front(); // get front element from queue

        q.pop(); // pop front element
        for(int num: graph[current]){
            if(visited[num] == false){
                q.push(num);
                visited[num] = true;
                (*child)[num] = (*child)[current] + 1; printf("%d: %d\n", num, (*child)[num]);

                printf("[+] %d VISITED\n", num);
                if(num == target2) return (*child)[num];
            }
        }
    }
    return -1; //queue๊ฐ€ empty๊ฐ€ ๋˜์–ด๋„ num == target2์ธ ์กฐ๊ฑด์ด ์—†์–ด์„œ ๋ฆฌํ„ดํ•˜์ง€ ๋ชปํ•จ == target2 ์ฐพ์ง€ ๋ชปํ•จ == target2๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์Œ
}

int main(){
    int n, m, target1, target2; // n: # of nodes, m: # of edges

    scanf("%d", &n);
    scanf("%d %d", &target1, &target2);
    scanf("%d", &m);

    deque<int> graph[n];
    deque<int> child[n]; // parent - child
    bool visited[n]; // check if visited

    fill(visited, visited+n, false);

    for(int i=0; i<m; i++)
    {
        int u,v, result; 

        scanf("%d %d", &u, &v);

        graph[u-1].push_back(v-1);
        graph[v-1].push_back(u-1);
    }

    int result = BFS(target1-1, target2-1, graph, visited, child);

    printf("%d\n", result);
}
  • graph: parent, child ๋ชจ๋‘ ๊ฐ์ž์˜ deque ๊ณต๊ฐ„์— ์„œ๋กœ๋ฅผ ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ž˜์•ผ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ์„ฑ์œผ๋กœ BFS ํƒ์ƒ‰์„ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
  • child: ๊ฐ ๋…ธ๋“œ์˜ parent์™€ child์˜ ์ดŒ์ˆ˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์‹œ์ž‘ ๋…ธ๋“œ ๊ธฐ์ค€์œผ๋กœ BFS ํƒ์ƒ‰ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ดŒ์ˆ˜๊ฐ€ ๊ณ„์‚ฐ๋œ๋‹ค.
  • 0๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๊ฐ’์„ ๋„ฃ์–ด์„œ, ์ž…๋ ฅ๋ฐ›๋Š” ๊ฐ’-1๋กœ BFS๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.
  • visited๋Š” ์ดˆ๊ธฐ์— false๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ํ•ด๋‹น ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค true๋กœ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.
  • ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ดŒ์ˆ˜๋Š”, ์ž์‹ ์„ ๋ถ€๋ฅธ current ๋…ธ๋“œ ์ดŒ์ˆ˜ + 1๋กœ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.
    • ์•„๋ž˜์˜ ์ดŒ์ˆ˜ ๊ณ„์‚ฐ ๊ฒฝ์šฐ๋“ค์— ๋Œ€ํ•œ target1 ๊ธฐ์ค€ ์ดŒ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • target2์™€ num์ด ๊ฐ™๋‹ค๋ฉด child[num]์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • ๋งŒ์•ฝ while๋ฌธ์—์„œ ๋‚˜์™”๋‹ค๋ฉด, queue๊ฐ€ empty๊ฐ€ ๋œ ๊ฒƒ์ด๊ณ , empty๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฆฌํ„ดํ•˜์ง€ ๋ชปํ•œ, ์ฆ‰ target2๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋‹ค.
    • ๋”ฐ๋ผ์„œ ์ดŒ์ˆ˜ ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ -1์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

image

 

์ดŒ์ˆ˜ ๊ณ„์‚ฐ

  • ๋ถ€๋ชจ - ์ž์‹: 1์ดŒ
  • ํ˜•์ œ: 1์ดŒ
  • ๋‚˜ ์ž์‹ : 0์ดŒ => target1 == target2์ธ ๊ฒฝ์šฐ ๊ทธ๋ƒฅ ๋‚˜์˜ค๊ฒŒ ๋˜๋ฏ€๋กœ result = 0
  • ๋‚˜์™€ ์•„๋ฒ„์ง€์˜ ํ˜•์ œ: 3์ดŒ

image

๐Ÿ‘ ๊ฒฐ๊ณผ


image

728x90
๋ฐ˜์‘ํ˜•

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ