코딩 테스트 준비! (백준)/DFS

[DFS] 백준 14889번 스타트와 링크(C++)

lee-soo 2025. 4. 11. 18:17

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

 

풀다 현타옴

어려워서

 

 

핵심

 

더블 중복문 안에서, 한번 정해지면 다른팀은 자동으로 정해짐을 알고 있어야함

 

 

사실 이제, 비스무리하게 모든 경우의수를 처리해야 한다는것은 깨닫고 있었고

 

visited를 1차원 배열로 사용해야 함을 깨닫고 있었음

왜?

 

visited[][]을 2차원 배열로 하게되면

1,3의 이 true가 되면 1 4는 false까 1이 또 선택될 수 있는 느낌

 

그래서 단순한 1차원 배열로 사용해야 했어

 

 

 

코드로보여줌

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
bool visited[20];
int arr[20][20];
int sum = 0;
int temp_min = 1000000;
void task(int depth, int n, int id);
int main()
{
    int n;
    cin >> n;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> arr[i][j];
        }
    }
    task(0, n, 0);
    cout << temp_min << "\n";
}
void task(int depth, int n, int id)
{
    if (depth == n / 2)
    {
        int start = 0, link = 0;
        for (int i = 0; i < n - 1; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                if (visited[i] && visited[j])
                {
                    start += arr[i][j] + arr[j][i];
                }
                else if (!visited[i] && !visited[j])
                {
                    link += arr[i][j] + arr[j][i];
                }
            }
        }

        temp_min = min(temp_min, abs(start - link));
        return;
    }

    for (int i = id; i < n; i++)
    {
        if (!visited[i])
        {
            visited[i] = true;
            task(depth + 1, n, i + 1);
            visited[i] = false;
        }
    }
}

 

사실 여기서 헷갈렸던게

처음 for문을 들어갈 때, 2중 for문을 사용해서 i,j를 통해 미리 한번 start 팀을 잡고 가려 했는데

 

오히려 복잡해지고 차라리 visited 만 가지고 depth의 길이가 충족될 때 위에서 다 계산하는게 나을거라는 결론을 봄

 

하 어려워