번 정점에서 번호가 더 큰 정점으로 이어지는 간선의 수를 , 번호가 더 작은 정점으로 이어지는 간선의 수를 라고 하자. 그러면 이다.
, 으로 두자. 에서 로 넘어갈 때 왼쪽 끝점이 인 간선 개가 새로 포함되고, 오른쪽 끝점이 인 간선 개가 제외된다. 따라서 이고, 다음 식으로 를 앞에서부터 유일하게 복원할 수 있다.
각 에 대해 , 이어야 한다. 하나라도 만족하지 않으면 을 출력한다.
이제 정점을 부터 까지 순서대로 처리한다. 이전에 처리한 각 정점에 대해 앞으로 번호가 더 큰 정점과 연결해야 하는 남은 간선 수를 저장한다. 번 정점을 처리할 때는 이전 정점 중 정확히 개를 골라 번 정점과 연결해야 한다.
남은 간선 수가 가장 큰 개의 정점을 고른다. 우선순위 큐에 를 저장한다. 가장 큰 원소를 개 꺼내 정점 번호 를 얻을 때마다 간선 를 답에 추가하고 남은 간선 수를 감소시킨 뒤 다시 넣는다. 마지막으로 를 넣는다. 필요한 정점 수가 부족하거나 꺼낸 최댓값이 이면 불가능하다. 모든 정점을 처리한 뒤 남은 값이 모두 인지도 확인한다.
끝까지 성공했다면 기록한 간선들이 조건을 만족하는 그래프이므로 간선 개수와 간선 목록을 출력한다.
증명
어떤 가능한 그래프에서 현재 정점 가 이전 정점 와 연결되어 있고, 이전 정점 와는 연결되어 있지 않다고 하자. 현재 남은 간선 수가 라고 하자.
출력할 간선의 수를 이라 하자. 우선순위 큐 연산 횟수는 이므로 시간 복잡도는 이다. 구성한 간선을 저장하기 위해 의 공간을 사용할 수 있다.
와 연결한 뒤 는 이후 정점에 개의 간선을 더 사용하고, 는 이후 정점에 개의 간선을 사용한다. 따라서 이후 어떤 정점 에 대해 는 간선이고 는 간선이 아닌 경우가 존재한다. 그렇지 않다면 가 이후에 사용하는 모든 이웃을 도 사용하게 되어 이 되어 모순이다.
그러면 와 를 지우고 와 를 추가할 수 있다. 모든 정점의 차수와 왼쪽/오른쪽 간선 수는 변하지 않는다. 따라서 가능한 해가 있다면 현재 단계에서 남은 간선 수가 큰 정점을 우선하여 연결하는 가능한 해도 존재한다.
이 교환을 반복하면 매 단계에서 가장 큰 개의 남은 값을 선택하는 greedy가 항상 가능성을 보존한다. 그러므로 우선순위 큐 알고리즘이 실패하면 조건을 만족하는 그래프는 존재하지 않는다. 반대로 끝까지 성공하면 알고리즘이 실제로 기록한 간선들이 각 정점의 요구량을 정확히 만족하므로 올바른 그래프가 된다.
Solution written by GPT5.6