/// <summary> /// ヒープ化されている配列リストに新しい要素を追加する。 /// </summary> /// <param name="array">対象の配列リスト</param> static void PushHeap(List <ValueAndPriority> array, ValueAndPriority elem) { int n = array.Count; array.Add(elem); while (n != 0) { int i = (n - 1) / 2; if (array[n].priority.CompareTo(array[i].priority) > 0) { ValueAndPriority tmp = array[n]; array[n] = array[i]; array[i] = tmp; } n = i; } }
/// <summary> /// ヒープから最大値を削除する。 /// </summary> /// <param name="array">対象の配列リスト</param> static void PopHeap(List <ValueAndPriority> array) { int n = array.Count - 1; array[0] = array[n]; array.RemoveAt(n); for (int i = 0, j; (j = 2 * i + 1) < n;) { if ((j != n - 1) && (array[j].priority.CompareTo(array[j + 1].priority) < 0)) { j++; } if (array[i].priority.CompareTo(array[j].priority) < 0) { ValueAndPriority tmp = array[j]; array[j] = array[i]; array[i] = tmp; } i = j; } }