Loading [MathJax]/jax/output/CommonHTML/jax.js

ABOUT ME

-

  • [Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ]BOJ 14889 - ์Šคํƒ€ํŠธ์™€ ๋งํฌ
    Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ/BOJ 2021. 6. 18. 23:44

    ๋ฌธ์ œ ๋ถ„์„

    ์Šคํƒ€ํŠธํŒ€์„ Tstart, ๋งํฌํŒ€์„ Tlink ๊ทธ๋ฆฌ๊ณ  ๋‘ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋ฅผ ๊ฐ๊ฐ Sstart,Slink๋ผ๊ณ  ํ•˜์ž. ์ด๋•Œ ๊ฐ ํŒ€์— ์†ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ˆ˜๋Š” ๋‘ ํŒ€ ๋ชจ๋‘ ์ถ•๊ตฌ๋ฅผ ํ•˜๋Š” N (4โ‰คNโ‰ค20)๋ช…์˜ ์ ˆ๋ฐ˜์ธ N/2 ๋ช…์ด๋‹ค.

    ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” min(|Sstartโˆ’Slink|)๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์€ (Tstart,Tlink)์˜ ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ตฌํ•œ ๋’ค ๊ฐ ์กฐํ•ฉ์˜ |Sstartโˆ’Slink|์„ ๊ตฌํ•˜๊ณ  ๊ทธ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

    ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋“ค์€ ์ฃผ๋กœ 'backtracking'์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ฌธ์ œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ backtracking์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค.

     

    ๋ฌธ์ œ ํ’€์ด

    ์ถ•๊ตฌ๋ฅผ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋งˆ๋‹ค ๊ณ ์œ ์˜ id๊ฐ€ ์žˆ๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ๊ฐ 1, 2, ... , N์ด๋ผ๊ณ  ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ๊ฐ id๋ฅผ ํ•˜๋‚˜์˜ vertex๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

    ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” (Tstart,Tlink)์˜ ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๊ฒฐ๊ตญ (์„ ํƒํ•œ N / 2๊ฐœ์˜ vertex, ์„ ํƒํ•˜์ง€ ์•Š์€ N / 2๊ฐœ์˜ vertex)์˜ ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์™€ ๊ฐ™๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. vetex๋“ค์„ ์„ ํƒํ•  ๋•Œ๋Š” ์ด๋ฏธ ์„ ํƒ๋˜์ง€ ์•Š์€ vertex๋“ค๋งŒ ์„ ํƒํ•˜๊ณ  ์ด๋•Œ ์“ฐ์ด๋Š” ์ ํ™”์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

     

    f(id,nmember,N)={calc |Sstartโˆ’Slink| and compareif nmember==N/2(base case)f(id+1,nmember+1,N)else if vertexid+1 is not visited(recursive case)โ€‹

     

    ์ด๋•Œ ์ฃผ์˜ํ•  ์ ์€ ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด 1๋ถ€ํ„ฐ N๊นŒ์ง€ backtrackingํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด N / 2๊ฐœ์˜ vertex๋งŒ ์„ ํƒํ•˜๋ฉด ๋‚˜๋จธ์ง€ N / 2๊ฐœ์˜ vertex๋“ค์€ ์ž๋™์œผ๋กœ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ N / 2๊ฐœ์˜ vertex๋งŒ backtrackingํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด 4๊ฐœ์˜ vertex ์ค‘ 2๊ฐœ๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์€ (1,2),(1,3),(1,4),(2,3),(2,4),(3,4)์ด๋ ‡๊ฒŒ 6๊ฐœ์ด๋‹ค. ํ•˜์ง€๋งŒ (1,2) ์„ ํƒ์‹œ ์„ ํƒ๋˜์ง€ ์•Š๋Š” vertex๋“ค์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ (3,4)๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

    ๋ณต์žก๋„ ๋ถ„์„

    n๋ช…์˜ ์‚ฌ๋žŒ๋“ค์ด ์ถ•๊ตฌ๋ฅผ ํ•œ๋‹ค๊ณ  ํ•  ๋•Œ ๋ณต์žก๋„๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     

    ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n!)

    - recursive call์„ i๋ฒˆ ํ–ˆ์„ ๋•Œ ๊ฐ recursive call๋งˆ๋‹ค ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” id ์ฆ‰, vertex๊ฐ€ Nโˆ’i๊ฐœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

     

    ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(n2)

    - ๊ฐ™์€ ํŒ€์ผ๋•Œ ๋Šฅ๋ ฅ์น˜๋ฅผ ๊ธฐ๋กํ•œ 2์ฐจ์› ๋ฐฐ์—ด : O(n2)

    - n๊ฐœ์˜ vertex์— ๋Œ€ํ•œ visit ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐฐ์—ด : O(n)

    - Tstart,Tlink์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๋Š” vertor : O(n)

     

    ์ฝ”๋“œ

    #include <cstdio>
    #include <cstring>
    #include <climits>
    #include <cstdlib>
    #include <algorithm>
    #include <vector>
    #define MAX_NUM 20
    using namespace std;
    vector<int> team_start;
    vector<int> team_link;
    int S[MAX_NUM + 1][MAX_NUM + 1];
    bool visited[MAX_NUM + 1];
    int ans = INT_MAX;
    void backtrack(int id, int n_member, int N)
    {
    if (n_member == N / 2)
    {
    int S_start = 0, S_link = 0;
    int mem_i, mem_j;
    for (int i = 1; i <= N; i++)
    {
    if (visited[i])
    team_start.push_back(i);
    else
    team_link.push_back(i);
    }
    for (int i = 0; i < team_start.size(); i++)
    {
    mem_i = team_start[i];
    for (int j = i + 1; j < team_start.size(); j++)
    {
    mem_j = team_start[j];
    S_start += (S[mem_i][mem_j] + S[mem_j][mem_i]);
    }
    }
    for (int i = 0; i < team_link.size(); i++)
    {
    mem_i = team_link[i];
    for (int j = i + 1; j < team_link.size(); j++)
    {
    mem_j = team_link[j];
    S_link += (S[mem_i][mem_j] + S[mem_j][mem_i]);
    }
    }
    ans = min(ans, abs(S_start - S_link));
    team_start.clear();
    team_link.clear();
    return;
    }
    for (int i = id + 1; i <= N; i++)
    {
    if (!visited[i])
    {
    visited[i] = true;
    backtrack(i, n_member + 1, N);
    visited[i] = false;
    }
    }
    }
    int main()
    {
    int N, _s;
    memset(visited, false, sizeof(visited));
    scanf("%d", &N);
    for (int i = 1; i <= N; i++)
    {
    for (int j = 1; j <= N; j++)
    {
    scanf("%d", &_s);
    S[i][j] = _s;
    }
    }
    for (int i = 1; i < N / 2; i++)
    {
    visited[i] = true;
    backtrack(i, 1, N);
    visited[i] = false;
    }
    printf("%d", ans);
    return 0;
    }
    view raw boj_14889.cpp hosted with โค by GitHub

     

    ๋ฌธ์ œ ์ถœ์ฒ˜ ๋ฐ ์›๋ณธ ๋ฌธ์„œ

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

     

    14889๋ฒˆ: ์Šคํƒ€ํŠธ์™€ ๋งํฌ

    ์˜ˆ์ œ 2์˜ ๊ฒฝ์šฐ์— (1, 3, 6), (2, 4, 5)๋กœ ํŒ€์„ ๋‚˜๋ˆ„๋ฉด ๋˜๊ณ , ์˜ˆ์ œ 3์˜ ๊ฒฝ์šฐ์—๋Š” (1, 2, 4, 5), (3, 6, 7, 8)๋กœ ํŒ€์„ ๋‚˜๋ˆ„๋ฉด ๋œ๋‹ค.

    www.acmicpc.net

    https://www.notion.so/BOJ-14889-cb96bb89dce24aa88b7b955bc050c074

     

    BOJ 14889 - ์Šคํƒ€ํŠธ์™€ ๋งํฌ

    ๋ฌธ์ œ ๋ถ„์„

    www.notion.so

     

    ๋Œ“๊ธ€

Designed by Tistory.