is_graphic(d): d 를 내림차순 정렬 if any d[i] < 0: return false if sum(d) % 2 == 1: return false if all d[i] == 0: return true x = d[0] # 가장 큰 차수 d[0] = 0 for i = 1..x: d[i] -= 1 if d[i] < 0: return false return is_graphic(d) # 재귀
구현
// Havel-Hakimi 로 graphic sequence 판별#include <bits/stdc++.h>using namespace std;bool havel_hakimi(vector<int> d) { while (true) { sort(d.rbegin(), d.rend()); // 내림차순 while (!d.empty() && d.back() == 0) // 0 제거 d.pop_back(); if (d.empty()) return true; // 모두 0 int x = d.front(); // 최대 차수 d.erase(d.begin()); if (x > (int)d.size()) return false; // 정점 부족 for (int i = 0; i < x; i++) { d[i]--; if (d[i] < 0) return false; } }}int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> d(n); for (auto& v : d) cin >> v; cout << (havel_hakimi(d) ? 1 : -1) << "\n"; return 0;}
# Havel-Hakimi algorithmfrom heapq import nlargestdef is_graphic(d): d = sorted(d, reverse=True) while d and d[-1] == 0: d.pop() if not d: return True x = d[0] d = d[1:] if x > len(d): return False for i in range(x): d[i] -= 1 if d[i] < 0: return False return is_graphic(d)n = int(input())d = list(map(int, input().split()))print(1 if is_graphic(d) else -1)
// Havel-Hakimi in Javaimport java.util.*;public class Main { static boolean hh(ArrayList<Integer> d) { while (true) { Collections.sort(d, Collections.reverseOrder()); while (!d.isEmpty() && d.get(d.size()-1) == 0) d.remove(d.size()-1); if (d.isEmpty()) return true; int x = d.remove(0); if (x > d.size()) return false; for (int i = 0; i < x; i++) { d.set(i, d.get(i) - 1); if (d.get(i) < 0) return false; } } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); ArrayList<Integer> d = new ArrayList<>(); for (int i = 0; i < n; i++) d.add(sc.nextInt()); System.out.println(hh(d) ? 1 : -1); }}
stdin
53 3 2 2 2
결과
1
stdin
43 3 3 1
결과
-1
복잡도
항목
값
Havel-Hakimi 시간
O(N^2) (매 단계 정렬)
Erdos-Gallai 시간
O(N^2) (k 마다 합)
최적화 Erdos-Gallai
O(N log N) (prefix sum + binary search)
공간
O(N)
변형 / 활용
정리
접근
특징
Havel-Hakimi
구성적 (constructive)
실제 그래프 복원 가능
Erdos-Gallai
판별적 (decision)
부등식만 확인
Gale-Ryser
이분 그래프용
bipartite degree sequence
함정
1. 정렬 유지
각 단계마다 내림차순 정렬을 유지해야 함. 차수를 감소시킨 후 정렬하지 않으면 결과가 달라짐.
💬 댓글