문제 정보
- 문제: https://www.acmicpc.net/problem/7577
- 요약: 길이 K인 직선 도로에 물체가 묻혀 있습니다. N개의 탐사 결과 Probe[x,y]=r (구간 [x,y]에 물체가 r개)가 주어질 때, 모든 조건을 만족하는 물체 배치를 찾거나, 불가능하면 “NONE"을 출력합니다.
- 제한: 시간 1초, 메모리 128MB, 3 <= K <= 40, 2 <= N <= 1,000, 1 <= x <= y <= K, 0 <= r <= 1,000
입출력 형식/예제
| |
| |
예제 설명:
- 예제 1: 위치 3, 6, 7, 8, 9, 12에 물체가 있는 배치가 모든 조건을 만족
- 예제 2: [4,7]에 3개 필요하지만 [1,10]에 1개만 있을 수 있으므로 모순 (4
7은 110의 부분집합)
접근 개요
핵심 관찰
- 누적합으로 모델링: S[i] = 위치 1부터 i까지 물체의 개수 (S[0] = 0)
- 제약 조건 변환:
- Probe[x,y] = r => S[y] - S[x-1] = r
- 각 위치에는 물체가 0개 또는 1개 => S[i] - S[i-1] in {0, 1}
- 차분 제약 시스템: 등식을 두 부등식으로 분리하여 그래프 최단경로 문제로 변환
- 음수 사이클: 해가 존재하지 않으면 그래프에 음수 사이클이 존재
알고리즘 흐름
| |
알고리즘 설계
차분 제약 조건 (Difference Constraints)
차분 제약 시스템은 다음 형태의 부등식 집합입니다:
- x_j - x_i <= c_ij
이를 그래프로 모델링합니다:
- 노드: 각 변수 x_i
- 간선: i -> j, 가중치 c_ij (x_j - x_i <= c_ij 조건에서)
정리: 차분 제약 시스템의 해가 존재하는 필요충분조건은 대응하는 그래프에 음수 사이클이 없는 것입니다.
SPFA (Shortest Path Faster Algorithm)
Bellman-Ford의 최적화 버전으로, 큐를 사용하여 필요한 노드만 완화합니다:
- 각 노드가 큐에 n번 이상 들어가면 음수 사이클 존재
- 평균 시간복잡도: O(E), 최악: O(VE)
결과 구성
SPFA 완료 후 dist[i] - dist[i-1]이 1이면 해당 위치에 물체가 있고, 0이면 없습니다.
복잡도
- 시간: O(N * K) - N개 제약 조건, K개 노드에서 SPFA
- 공간: O(K + N) - 인접 리스트와 거리 배열
구현
| |
코너 케이스 체크리스트
- 상호 모순 조건: [x1,y1]과 [x2,y2]가 포함관계인데 개수가 맞지 않는 경우 -> NONE
- 단일 위치 조건: Probe[i,i]=0 또는 Probe[i,i]=1 -> 해당 위치 확정
- 전체 범위 조건: Probe[1,K]=r -> 전체 물체 개수 결정
- 빈 결과: 모든 조건에서 r=0 -> 모두 ‘-’
- 최대 입력: K=40, N=1000 -> 시간 내 충분히 처리 가능
제출 전 점검
- 입력 형식: K, N 먼저 읽고 N개의 x y r 읽기
- 출력 형식: 길이 K인 문자열 또는 “NONE”
- 오버플로우: 거리 계산에 long long 사용
- 음수 사이클 탐지: 방문 횟수 > n 조건
- 인덱싱: 문제는 1-indexed, 코드는 0-indexed S[0] 사용
참고자료/유사문제
- 백준 1219 - 오민식의 고민 - Bellman-Ford 음수 사이클
- 백준 11657 - 타임머신 - Bellman-Ford 기본
- Difference Constraints 개념
- CLRS Chapter 24.4 - Difference Constraints and Shortest Paths
![Featured image of post [Algorithm] C++ 백준 7577번: 탐사](/post/algorithm/2025-12-02-boj-7577-exploration-difference-constraints-spfa-cpp-solution/wordcloud_hu_1a2929db9b942721.png)
![[Algorithm] C++ 백준 2626번: 헬기착륙장](/post/algorithm/2025-12-02-boj-2626-helicopter-landing-site-minenc-cpp-solution/wordcloud_hu_4445322990b006e3.png)
![[Algorithm] C++ 백준 4354번: 문자열 제곱](/post/algorithm/2025-12-02-boj-4354-string-power-period-kmp-cpp-solution/wordcloud_hu_cd8c6924b1ac5ab.png)
![[Algorithm] C++ 백준 7577번: 탐사](/post/algorithm/2025-12-02-boj-7577-exploration-difference-constraints-spfa-cpp-solution/wordcloud_hu_2a0dd3ac39086d6a.png)
![[Algorithm] C++ 백준 8096번 모노크로매틱 삼각형](/post/algorithm/2025-12-02-boj-8096-monochromatic-triangles-graph-cpp-solution/wordcloud_hu_1363dd3799982cba.png)
![[Algorithm] C++ 백준 1031번: 스타 대결](/post/algorithm/2025-10-14-boj-1031-star-battle-cpp-solution/wordcloud_hu_f77f5f84ec32b33a.png)
![[Algorithm] C++ 백준 11407번: 책 구매하기 3](/post/algorithm/2025-08-14-boj-11407-book-purchasing-3-mincost-maxflow-cpp-solution/wordcloud_hu_ebb13df0bbd37fa9.png)
![[Algorithm] C++ 백준 16583번: Boomerangs - DFS 간선 페어링](/post/algorithm/2025-08-14-boj-16583-boomerangs-dfs-edge-pairing-cpp-solution/wordcloud_hu_e4344de8758dbc69.png)
![[Algorithm] C++ 백준 2912번: 백설공주와 난쟁이 - 세그트리+후보검증](/post/algorithm/2025-08-14-boj-2912-snow-white-and-dwarfs-cpp-solution/wordcloud_hu_442ec164d6305df.png)
![[Algorithm] C++ 백준 4001번: 미노타우르스 미궁](/post/algorithm/2025-08-14-boj-4001-minotaur-labyrinth-cpp-solution/wordcloud_hu_25bddecfb46e9789.png)