1 Отредактировано aza_inf (2010-05-16 18:58:31)

Тема: Who are you, Mister Graph?

Given degrees of a graph vertices, determine whether they conform to any undirected graph.
If so - output it. It is guaranteed that in the case when the graph exists, the number of edges does not exceed 500000. The graph should not contain loops and multiple edges.
*loop = петля
----------------------------
The first line of the input file contains an integer N - the number of vertices in the graph (1 < N <= 10000).
N numbers are written in the next line:  d1, d2, ..., dn - the degrees of vertices (0 <= di <= 10000). Numbers in the line are separated by spaces.
-----------------------------
Write "YES" or "NO" - depending on the existence of a graph.
If yes, the first line should contain M - the number of edges in the resulting graph, and the following M lines must contain the description of each edge - numbers of vertices, that are the ends of the corresponding edge. Vertices are numbered starting from one in the order they are given in the input file.
If there are multiple graphs satisfying the condition, output any.
----------------------------
например:
input
4
2 1 2 3
output
YES
4
4 3
4 1
4 2
3 1

2

Re: Who are you, Mister Graph?

Если суммарная степень нечетная, либо степень какой-то вершины превышает N-1 - искомого графа не существует. Иначе возьмем вершину максимальной степени, добавим от нее ребра к К вершинам с наибольшими степенями, где К - степень данной вершины, уменьшив при этом степени всех вершин к которым мы провели ребра на 1. Далее будем повторять то же самое. Таким образом мы построим требуемый граф. Реализовать это можно за O(NlogN).

Докажем что алгоритм верен. Если есть граф из 2 вершин, то очевидно таким образом мы построим его. Пусть теперь есть граф из  N вершин ненулевой степени, причем суммарная их степень четная (1 условие) и максимальная степень не превышает N-1 (2 условие) и известно что для любого графа из N-1 вершины, для которого выполняются 2 условия, указанными операциями можно построить его. После выбора вершины степени К и выполнения указанной операции суммарная степень уменьшится на 2К, поэтому первое условие не нарушится. Если максимальная степень вершины меньше N-1, тогда после выполнения операции второе условие тоже будет выполняться. Если она равна N-1, то после операции степени всех остальных вершин уменьшатся на 1, поэтому никакая степень не будет превышать N-2.

3

Re: Who are you, Mister Graph?

Как реализовать этот алгоритм? Ну никак не получается за такую сложность! Подскажите пожалуйста!