Търсене на оптимално покриващо дърво

Цел: Да се намери най-тежкото (или най-лекото) покриващо дърво за неориентиран граф G с N върха и M ребра със зададени тегла.

Идея на алгоритъма:

1. Ребрата се прочитат и сортират по тегло.

2. Тръгваме от празна покриваща гора (гора състояща се от всички върхове на графа, без нито едно ребро).

3. Прибавяме ребра от сортирания масив по правилото:

Забележки:

1. Не се проверява коректност на данните.
2. G трябва да е свързан, иначе няма да се достигне бройката N-1 ребра в гората.

Бързодействие:

Първата фаза има сложност O(ln(M)*M), ако се ползва бърза сортировка (конкретната програма, дадена тук ползва бавна сортировка).

Втората фаза има сложност O(N^2).

Тъй като M<=N^2, общата сложност е ограничена от O(lnN*N^2).

Сходни задачи и допълнителни свойства:



ИМЕ НА ЗАДАЧАТА: greedy

ВХОДЕН ФОРМАТ:

* Ред 1: Две цели числа, разделени с интервал: N и M
  N е броят на върховете в графа (N<=1000), 
  а M е броят на ребрата (M<=10000). 

* Редове от 2 до M+1: 
  Всеки ред съдържа 3 параметъра: I, J и L, които описват ребро. 
  I и J са върховете на реброто, L е теглото му.


ПРИМЕРЕН ВХОД (файл greedy.in):

6 10
2 5 3
4 6 2
1 6 1
4 5 2
6 3 2
1 2 5
1 3 4
2 4 4
3 2 1
6 2 1


ИЗХОДЕН ФОРМАТ:

* Редове от 1 до N-1: ребра на покриващото дърво
  Всеки ред съдържа по едно ребро от дървото, 
  като формата е същият както при входните данни.

ПРИМЕРЕН ИЗХОД:

1 2 5
1 3 4
2 4 4
2 5 3
4 6 2


Текст на алгоритъма:
(c) Skelet, 2004