๐Ÿ’ญ Problem Solving/C++

[BOJ][C++] ๋ฐฑ์ค€ 1260๋ฒˆ: DFS์™€ BFS

0=2. 2025. 4. 23. 15:32

๋ฌธ์ œ

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

 

๋ฌธ์ œ ์ดํ•ด

  • ๊ทธ๋ž˜ํ”„๋ฅผ DFS๋กœ ํƒ์ƒ‰ํ•œ ๊ฒฐ๊ณผ์™€ BFS๋กœ ํƒ์ƒ‰ํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ

 

๋ฌธ์ œ ํ’€์ด

์ฃผ์–ด์ง„ ๊ฐ„์„ ๊ณผ ๋‘ ์ •์ ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ด์šฉํ•ด ์ธ์ ‘ ํ–‰๋ ฌ์„ ์ €์žฅํ•œ๋‹ค.

 

๐Ÿ’ก DFS

ํ˜„์žฌ ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์ ์„ ์ˆœ์„œ๋Œ€๋กœ ์žฌ๊ท€ ํƒ์ƒ‰ํ•œ๋‹ค.

์‹œ์ž‘ V → V์™€ ์—ฐ๊ฒฐ๋œ ์ •์  A → A์™€ ์—ฐ๊ฒฐ๋œ ์ •์  B → B์™€ ์—ฐ๊ฒฐ๋œ ์ •์  C ..
  • ์ธ์ ‘ ํ–‰๋ ฌ adj[cur][1 ~ n] ์ˆœํšŒ. ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด dfs(next)
  • dfs ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋ฐฉ๋ฌธ ํ‘œ์‹œ & ์ถœ๋ ฅ ๋ฐฐ์—ด์— ์‚ฝ์ž…ํ•˜๊ธฐ
  • ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ด๋ฉด return

๐Ÿ’ก BFS

ํ˜„์žฌ ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์ ์„ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ํ์—์„œ ์ •์ ์„ ๊บผ๋‚ด๋ฉด์„œ ํƒ์ƒ‰ํ•œ๋‹ค.

์‹œ์ž‘ V → V์™€ ์—ฐ๊ฒฐ๋œ ์ •์  A → V์™€ ์—ฐ๊ฒฐ๋œ ์ •์  B → …
A์™€ ์—ฐ๊ฒฐ๋œ ์ •์  A’ → A’์™€ ์—ฐ๊ฒฐ๋œ ์ •์  A’’ → …
B์™€ ์—ฐ๊ฒฐ๋œ ์ •์  B' → B’์™€ ์—ฐ๊ฒฐ๋œ ์ •์  B’’ → …
  • ์‹œ์ž‘ ์ •์ ๋ถ€ํ„ฐ ํ์— ์‚ฝ์ž…ํ•˜์—ฌ ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ์ˆœํšŒํ•œ๋‹ค.
  • ํ์—์„œ ๊บผ๋‚ธ ํ˜„์žฌ ์ •์ ์„ ํƒ์ƒ‰ํ•œ๋‹ค.
    • ์ธ์ ‘ ํ–‰๋ ฌ adj[cur][1 ~ n] ์ˆœํšŒ. ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  ๋ฐฉ๋ฌธ ์•ˆ ํ•œ ์ •์ ์ด๋ฉด ํ์— ์ €์žฅ
    • ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋ฐฉ๋ฌธ ํ‘œ์‹œ & ์ถœ๋ ฅ ๋ฐฐ์—ด์— ์‚ฝ์ž…ํ•˜๊ธฐ

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int n, m, v;
vector<vector<bool>> adj;
vector<bool> visited_dfs;
vector<int> ans_dfs;

void dfs(int cur)
{
    if (visited_dfs[cur])
        return;

    visited_dfs[cur] = true;
    ans_dfs.push_back(cur);
    for (int next = 1; next < n + 1; next++)
    {
        if (adj[cur][next])
            dfs(next);
    }
}

vector<int> bfs()
{
    queue<int> q;
    vector<int> visited_bfs(n + 1, false);
    vector<int> ans_bfs;

    q.push(v);
    visited_bfs[v] = true;

    while(!q.empty()){
        int cur = q.front();
        ans_bfs.push_back(cur);
        q.pop();
        
        for(int next = 1; next < n + 1; next++){
            if (!adj[cur][next] || visited_bfs[next])
                continue;
            visited_bfs[next] = true;
            q.push(next);
        }
    }

    return ans_bfs;
}

int main()
{
    // ์ž…๋ ฅ
    int a, b;
    cin >> n >> m >> v;

    adj.assign(n + 1, vector<bool>(n + 1, false));
    visited_dfs.assign(n + 1, false);

    for (int i = 0; i < m; i++)
    {
        cin >> a >> b;
        adj[a][b] = true;
        adj[b][a] = true;
    }

    // ์—ฐ์‚ฐ
    dfs(v);

    // ์ถœ๋ ฅ
    for (int i : ans_dfs)
        cout << i << ' ';
    cout << '\n';
    for (int i: bfs())
        cout << i << ' ';

    return 0;
}