АСП1/К3 2019

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Задаци

1. задатак

Поставка

Граф из задатка 1.

На слици је приказан нетежински усмерени граф.

  1. Приказати редослед чворова након обиласка графа са слике по ширини, уколико се као почетни чвор зада чвор А. Чворови се убацују у структуру према лексикографском поретку уколико постоји више могућности.
  2. Приказати редослед чворова након итеративног обиласка графа са слике по дубини, уколико се као почетни чвор зада чвор А. Чворови се убацују у структуру према лексикографском поретку уколико постоји више могућности.

Решење

  1. АБИЦДМФЛК
  2. АИБЦМЛКДФ

2. задатак

Поставка

У неком малом месту се реновира мрежа улица. Све улице у месту су двосмерне. Да би се реновирало што више улица, потребно је обезбедити да између свака два важна објекта у месту (школа, болница, општина, итд.) постоји пут и да укупна дужина свих отворених путева за саобраћај у месту буде минимална. Уколико је мрежа улица и важних објеката представљена неусмереним тежинским графом са слике, навести који алгоритам би се могао искористити за решавање овог проблема и његовом применом одредити улице које треба да остану отворене за саобраћај током реновирања, према наведеним условима. Приказати поступак.

Решење

Могао би се применити Примов или Крушкалов алгоритам за добијање минимланог обухватног стабла. У наредном поступку биће коришћен Примов алгоритам:

  1. А-Е
  2. Е-Ф
  3. Е-D
  4. D-Ц
  5. C-Х
  6. Х-I
  7. C-Б
  8. Х-Г
  9. Г-I

Графови се налазе испод.

3. задатак

Поставка

Нека се посматра секвенцијални програмски код који се извршавана на некој 3А машини. Први операнд инструкције је одредишни, а преостала два су изворишни операнди. Приликом превођења, преводилац може да преуреди редослед извршавања инструкција да би извршио одређене оптимизације. Међутим, преуређивање редоследа две инструкције се може извршити само уколико не постоји зависности по подацима између њих. Зависност по подацима између инструкција постоји уколико се одредишни операнд (резултат) раније операције користи као изворишни операнд касније операције.

  1. Описати модел графа који се може искористити за моделовање зависности по подацима између инструкција.
  2. Објаснити који алгоритам би се могао искористити за проналажење свих могућих редоследа извршавања инструкција на основу задатог графа зависности по подацима.
  3. На примеру задатог програмског кода, нацртати граф зависности по подацима и одредити (написати) још један могућ редослед извршавања инструкција који задовољава присутне зависности по подацима.
ADD A, B, C
MUL C, E, D
SUB B, E, C
ADD A, D, E
SUB E, F, G
DIV D, F, H
ADD G, F, H

Решење

  1. У питању је ацикличан нетежински усмерен граф у ком чворови представљају инструкције а гране од једног ка другом чвору представљају зависност изворишних операнада другог чвора од одредишног операнда првог.
  2. Може се искористити модификација тополошког сортирања где се након сваког прикупљања чворова са улазним степеном 0 за сваки од њих покушавају наћи сви путеви који на том месту садрже тај чвор. Рекурзивна имплементација овог алгоритма је дата испод (где су путеви представљени уланчаним листама).
  3. Граф се састоји од свих чворова одвојених и једне гране између чворова MUL C, E, D и SUB B, E, C.
    • ADD A, B, C
    • ADD A, D, E
    • MUL C, E, D
    • SUB B, E, C
    • SUB E, F, G
    • DIV D, F, H
    • ADD G, F, H
TOP SORT ALL PATHS R(G)
if V = {} then
    return nil
end_if
return_paths = {}
for {n : (nV) and ((u, n) ∉ E)} do
    MARK_REMOVED(G, n)
    paths = TOP_SORT_ALL_PATHS_R(G)
    for pathpaths do
        new_path = GETNODE
        value(new_path) = n
        next(new_path) = path
        path = new_path
    end_for
    UNMARK_REMOVED(G, n)
    return_paths = return_paths + paths
end_for
return return_paths

4. задатак

Поставка

Посматра се усмерен нетежински граф. Написати итеративну функцију у псеудокоду која за прослеђени граф са датим бројем чворова н проналази све чворове који су путевима дужине тачно к удаљени од задатог почетног чвора ид.

Решење

Имплементација испод чворове враћа у уланчаној листи.

K-DISTANCE(G, n, k, id)
dist[n]
for i = 1 to n do
    dist[i] = ∞
end_for
dist[id] = 0
curr_dist = 0
tail = head = GETNODE(id)
next(head) = GETNODE(0)
head = next(head)
curr = 0
temp = nil
while (tail ≠ nil) and (curr_distk) do
    curr = value(tail)
    if curr = 0 then
        curr_dist = curr_dist + 1
        if headtail then
            next(head) = GETNODE(0)
            head = next(head)
        end_if
    else
        for node ∈ {v : (curr, v) ∈ E} do
            if dist[node] ≠ curr_dist + 1 then
                dist[node] = curr_dist + 1
                next(head) = GETNODE(node)
                head = next(head)
            end_if
        end_for
    end_if
    temp = tail
    tail = next(tail)
    FREENODE(temp)
end_while

return tail
GETNODE(node)
ALLOCATE(node)
next(node) = nil
value(node) = value
return node

5. задатак

Поставка

Флоyд алгоритам

  1. На слици је дат изглед матрица D и Т добијених као излаз Флоyд алгоритма. Нацртати могући изглед улазног графа и образложити одговор.
  2. Написати у псеудокоду функцију која на основу матрице Т добијене као излаз Флоyд-овог алгоритма реконструише најкраћи пут од чвора А до чвора C такав да се на њему налази чвор Б.
Матрица D
0 2 7
0 5
0
Матрица Т
0 1 2
0 0 2
0 0 0

Решење

Граф из задатка 5.
  1. Претпостављајући да нема грана негативне тежине видимо да је најкраћи пут дужине 2 и зато сигурно мора бити директна грана између А и Б. Пошто видимо да матрица D није симетрична претпостављамо да се ради о усмереном тежинском графу. На основу тренутног графа и D матрице видимо да је грана Б-C тежине 5, и све остало се слаже.
  2. У псеудокоду испод подразумева се да је пут представљен уланчаном листом. Уколико је враћено нил то значи да нема пута.
PATH(T, A, B, C)
curr = GETNODE(C)
next = nil
while value(curr) ≠ B do
    if T[B][value(curr)] = 0 then
        return nil
    end_if
    next = GETNODE(T[B][value(curr)])
    next(next) = curr
    curr = next
end_while
while value(curr) ≠ A do
    if T[A][value(curr)] = 0 then
        return nil
    end_if
    next = GETNODE(T[A][value(curr)])
    next(next) = curr
    curr = next
end_while

return curr

6. задатак

Поставка

Граф из задатка 6.

За граф са слике одредити тополошки поредак, а затим наћи критични пут и дозвољена кашњења за појединачне чворове.

Решење

  • Тополошки поредак: АБДЦФЕХГИЈК
  • Критични пут: АБЦЕХГЈК (или АБЦЕХГИЈК)
  • Табела:
Чвор ЕСТ ЛСТ L
А 0 0 0
Б 1 1 0
C 3 10 10 0
D 3 6 3
Е 15 15 0
Ф 6 11 13 2
Г 19 19 0
Х 16 16 0
I 21 21 0
Ј 22 22 0
К 24 24 0

7. задатак

Поставка

Која су два карактеристична начина за избор пута повећаног протока у проточном графу? На примеру проточног графа са слике у оквиру кога постоји већ успостављен проток по појединим гранама, нацртати резидуални граф и навести два карактеристична пута који илуструју наведене ситуације.

Решење

Два карактеристична начина за избор пута повећаног протока су:

  1. обичан БФС који ће наћи најкраћи пут од С до Т, на пример СБТ, и
  2. бирање пута који највише повећава проток, на пример СБАТ.

Графови су дати испод.

8. задатак

Поставка

Дијкстра-ин алгоритам

  1. Колика је сложеност Дијкстра-иног алгоритма и од којих операција у оквиру алгоритма то зависи? Објаснити.
  2. Написати псеудокод Дијкстра-иног алгоритма који проналази најкраће растојање између пара чворова x и y под претпоставком да се граф Г представља листама суседности. Специјализовати апстрактне операције где је то могуће.

Решење

Сложеност Дајкстриног алгоритма зависи од операција проналажења следећег чвора до којег је пут најкраћи и ажурирања матрице D са додавањем новог чвора у скуп С. Може бити у случају да се проналажење следећег чвора до којег је пут најкраћи извршава у и да је граф представљен матрицом суседности. Боља сложеност достиже се онда када је граф представљен листом суседности и операција проналажења следећег чвора са најкраћим путем има сложеност од , када је сложеност .

DIJKSTRA ADJ LIST(G, x, y)
S = {x}
for i = 1 to n do
    d[i] = w[x, i]
    if d[i] = ∞ then
        t[i] = 0
    else
        t[i] = x
    end_if
end_for
for k = 1 to n-1 do
    start_node = -1
    for i ∈ (V - S) do
        if (start_node = -1) or (d[i] < d[start_node]) then
            start_node = i
        end_if
    end_for
    S = S + {start_node}
    adj_node = AL[start_node]
    while adj_node ≠ nil do
        if w[start_node, value(adj_node)] + d[start_node] < d[value(adj_node)] then
            d[value(adj_node)] = w[start_node, value(adj_node)] + d[start_node]
            t[value(adj_node)] = start_node
        end_if
        adj_node = next(adj_node)
    end_while
end_for

return d[y]