개발일지/알고리즘

백준 14889번 : 스타트와 링크

김진우 개발일지 2025. 2. 2. 18:34
#include <iostream>
#include <vector>
#include <cmath>
#include <climits>
#include <algorithm>
using namespace std;

void divideTeams(const vector<vector<int>>& S, int N, vector<int>& team, int idx, int count, int& result) {
    if (count == N / 2) {
        vector<int> linkTeam;
        for (int i = 1; i <= N; i++) {
            if (find(team.begin(), team.end(), i) == team.end()) {
                linkTeam.push_back(i);
            }
        }

        int startAbility = 0, linkAbility = 0;
        for (int i = 0; i < N / 2; i++) {
            for (int j = i + 1; j < N / 2; j++) {
                startAbility += S[team[i] - 1][team[j] - 1] + S[team[j] - 1][team[i] - 1];
            }
        }

        for (int i = 0; i < N / 2; i++) {
            for (int j = i + 1; j < N / 2; j++) {
                linkAbility += S[linkTeam[i] - 1][linkTeam[j] - 1] + S[linkTeam[j] - 1][linkTeam[i] - 1];
            }
        }

        result = min(result, abs(startAbility - linkAbility));
        return;
    }

    for (int i = idx; i <= N; i++) {
        team.push_back(i);
        divideTeams(S, N, team, i + 1, count + 1, result);
        team.pop_back();
    }
}

int main() {
    int N;
    cin >> N;
    vector<vector<int>> S(N, vector<int>(N));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> S[i][j];
        }
    }

    int result = INT_MAX;
    vector<int> team;
    divideTeams(S, N, team, 1, 0, result);
    cout << result << endl;

    return 0;
}