[백준] 20007번 떡 돌리기 (C++)

2025. 8. 1. 19:46·Algorithm
728x90

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

 

 

이 문제는 0부터 N-1까지의 노드가 주어지고 M개의 간선(+ 가중치)에 따라 연결관계가 주어질때 X만큼을 넘지 않으면서 모든 노드에

떡을 나눠주었을때 걸리는 최소 일 수를 구하는 문제이다.

 

주어진 문제에서 핵심적으로 봐야할 부분은 떡은 한번에 하나씩만 들 수 있는 것이다

따라서 시작점에서 다른노드로 갔을경우 무조건 다시 시작점으로 돌아가야지 떡을 다시 나눠줄 수 있다.

 

이 문제를 해결할때 저 문장을 자세히 안봐서 풀기 되게 까다로웠다...

 

따라서

1. 시작점에서 다익스트라 알고리즘을 사용하여 모든 노드에 갈 수 있는 최단거리(비용)을 구한다.

2. 시작점을 제외한 비용값 * 2를 최소힙에 넣는다.

3. 최소 비용들을 계속 더하면서 X를 넘을때 일수를 증가시키며 다시 합한다.

 

 

테스트케이스 1번을 사진과 같이 보면 이해가 쉽다.

 

 

이 문제에서의 핵심은 시작점에서 모든 노드를 도착했을때 최소 비용을 구했을때(가기만 할때)

X 2를 하였을때(왕복 비용)

 

즉 X2를 했을때를 구하여 최소 일수를 세주는 것이 핵심이였다.

 

정답 코드

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

int dx[] = {0, 1, -1, 0, 1, -1, -1, 1};
int dy[] = {1, 0, 0, -1, -1, 1, -1, 1};
int N, M, X, Y;
vector<vector<pii>> v(1001);
int dist[1001];

void dijkstra(int a) {
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    dist[a] = 0;
    pq.push({0, a});        // 비용, 노드

    while(!pq.empty()) {
        int Node = pq.top().second;
        int cost = pq.top().first;
        pq.pop();

        if(dist[Node] < cost) continue;

        for(auto it : v[Node]) {
            int nextNode = it.first;
            int nextcost = cost + it.second;

            if(dist[nextNode] > nextcost) {
                pq.push({nextcost, nextNode});
                dist[nextNode] = nextcost;
            }
        }
    }
}

void Init() {
    for(int i = 0; i < N; i++) {
        dist[i] = MAX;
    }
}

void solve() {
    dijkstra(Y);

    priority_queue<int, vector<int>, greater<int>> pq;

    for(int i = 0; i < N; i++) {
        dist[i] *= 2;
    }

    for(int i = 0; i < N; i++) {
        if(i != Y) {
            pq.push(dist[i]);
        }
    }

    int tmp = 0;
    int cnt = 0;

    while(!pq.empty()) {
        int x = pq.top();
        pq.pop();

        if(x > X) {
            cout << -1;
            return;
        }

        if(tmp + x> X) {
            tmp = 0;
            cnt++;
        }

        tmp += x;
    }

    if(tmp > 0) cnt++;

    cout << cnt;
}

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

    Init();

    for(int i = 0; i < M; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        v[a].push_back({b, c});
        v[b].push_back({a, c});
    }
}

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

    input();
    solve();
}

 

 

 

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

'Algorithm' 카테고리의 다른 글

[백준] 25193번 곰곰이의 식단 관리 (C++)  (0) 2025.08.03
[백준] 3987번 보이저 1호 (C++)  (0) 2025.08.02
[백준] 4803번 트리 (C++)  (0) 2025.07.31
[백준] 14923번 미로 탈출 (C++)  (0) 2025.07.30
[백준] 1715번 카드 정렬하기 (C++)  (0) 2025.07.29
'Algorithm' 카테고리의 다른 글
  • [백준] 25193번 곰곰이의 식단 관리 (C++)
  • [백준] 3987번 보이저 1호 (C++)
  • [백준] 4803번 트리 (C++)
  • [백준] 14923번 미로 탈출 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (287) N
      • Programming (54) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (10) N
        • 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 (2)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 20007번 떡 돌리기 (C++)
상단으로

티스토리툴바