[백준] 21278번 호석이 두 마리 치킨 (C++)

2025. 10. 21. 15:47·Algorithm
728x90

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

 

 

이 문제는 N개의 노드가 있을때 N개중 2개의 노드를 치킨집으로 지정하고 N-2개의 노드에 대해서 가장 가까운 치킨집의 거리의 합을 최소로 만드는 노드를 출력하는 문제이다.

 

1. N개의 노드 중 각각의 노드에 대해서 거리를 기록해야한다.

 

2. N개중 2개를 선택하는 경우의 수를 구해야한다.

 

저 2개의 문제만 해결하면 간단하게 풀 수 있다. 

1번을 해결하기 위해서 플로이드 워셜을 사용하여 모든 노드에 대한 거리를 알아내었으며

2번은 백트래킹 조합을 사용하여 가지 수를 알아내었으며 최소거리를 알아내기 위해서 2번 모든 조합을 탐색하며 최솟값과 노드를 기록하고

 

최솟값이 업데이트될 경우 노드를 업데이트 하였다.

 

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    int y;
    int r;
};

int dx[] = {-1, 1, 0, 0, 1, -1, -1, 1};
int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
int N, M;
int graph[101][101];
bool visited[101];
int answer = MAX;
pii ans = {MAX, MAX};
int arr[2];

void Init() {
    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= N; j++) {
            if(i == j) continue;
            graph[i][j] = MAX;
        }
    }
}

void Print() {
    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= N; j++) {
            cout << graph[i][j] << " ";
        }
        cout << endl;
    }
}

void bt(int x, int cnt) {
    if(cnt == 2) {
        int tmpdist = 0;

        for(int i = 1; i <= N; i++) {
            bool flag = false;
            int dist = MAX;
            for(int j = 0; j < 2; j++) {
                if(arr[j] == i) {
                    flag = true;
                    break;
                }
            }
            if(!flag) {
                dist = min(graph[arr[0]][i], graph[arr[1]][i]);
                tmpdist += dist;
            }
        }

        tmpdist *= 2;

        if(answer > tmpdist) {
            answer = tmpdist;
            ans.first = arr[0];
            ans.second = arr[1];
        }
        else if(answer == tmpdist) {
            if(ans.first > arr[0]) {
                ans.first = arr[0];
                ans.second = arr[1];
            }
            else if(ans.first == arr[0]) {
                if(ans.second > arr[1]) {
                    ans.first = arr[0];
                    ans.second = arr[1];
                }
            }
        }
        return;
    }

    for(int i = x; i <= N; i++) {
        if(!visited[i]) {
            visited[i] = true;
            arr[cnt] = i;
            bt(x+1, cnt+1);
            visited[i] = false;
        }
    }
}

void solve() {
    for(int k = 1; k <= N; k++) {
        for(int i = 1; i <= N; i++) {
            for(int j = 1; j <= N; j++) {
                graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
            }
        }
    }

    bt(1, 0);

    cout << ans.first << " " << ans.second << " " << answer;
}

void input() {
    cin >> N >> M;

    Init();

    for(int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        graph[a][b] = 1;
        graph[b][a] = 1;
    }
}


int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 14427번 수열과 쿼리 15 (C++)  (0) 2025.10.23
[백준] 6209번 제자리 멀리뛰기 (C++)  (0) 2025.10.22
[백준] 14585번 사수빈탕 (C++)  (0) 2025.10.20
[백준] 2887번 행성 터널 (C++)  (0) 2025.10.08
[백준] 12015번 가장 긴 증가하는 부분수열 2 (C++)  (0) 2025.10.07
'Algorithm' 카테고리의 다른 글
  • [백준] 14427번 수열과 쿼리 15 (C++)
  • [백준] 6209번 제자리 멀리뛰기 (C++)
  • [백준] 14585번 사수빈탕 (C++)
  • [백준] 2887번 행성 터널 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (279)
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    비트마스킹
    재귀
    깊이우선탐색
    c언어
    누적합
    투포인터
    백트래킹
    우선순위 큐
    Leviathan
    BFS
    DP
    에라토스테네스의 체
    wargame
    백준
    그리디
    브루트포스
    이분탐색
    시뮬레이션
    다익스트라
    구현
    트리
    DFS
    우선순위큐
    코딩
    linux
    정렬
    그래프 이론
    다이나믹 프로그래밍
    Bandit
    WebSecurity
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 21278번 호석이 두 마리 치킨 (C++)
상단으로

티스토리툴바