Пътища в контурна графика

За отворен граф с произволни тегла на дъги, проблемът с намирането на най-краткия път може да бъде решен в ОТНОСНО(м) стъпки. Помислете за модел без контурна графика (Фигура 10.5).

контурна

Фигура: 10.5. Графика на модела

Всяка отворена графика има следното свойство: нейните върхове могат да бъдат преномерирани, така че всяка дъга ще премине от върх с по-нисък номер към връх с по-голям номер.

Тази номерация ще се нарича правилна. За нашата моделна графика пример за възможно правилно номериране е показан на фиг. 10.6.

контурна

Фигура: 10.6. Правилно номериране

Доказателство за това свойство ще бъде правилният алгоритъм за номериране.

Алгоритъмът се основава на следния прост факт: има поне един връх в неконтролирана графика, в която не влиза нито една дъга (в противен случай в графиката ще има контур).

Поставяме всички такива върхове в стека. Тогава

1) извадете произволен връх от стека;

2) задайте му номер 1;

3) премахнете го от графиката заедно с всички дъги, които го напускат.

След операцията по премахване на дъги могат да се появят нови върхове, в които не влиза нито една дъга. Тези върхове се изтласкват върху стека, след което от стека се изскача произволен връх, на него се присвоява следващият номер и т.н.

Ясно е, че резултатът ще бъде правилната номерация, тъй като всеки връх u получава число в момента, когато останалите неномерирани върхове v (по-късно ще получат по-големи номера) или не са свързани чрез дъги с u, или дъгата върви в посока (uv).

Не е толкова очевидно защо всички върхове ще получат числа:

ако последният връх е премахнат от стека и в графиката, получена след премахването на този връх и дъгите, които го напускат, всички върхове имат дъги, които ги въвеждат, тогава те никога няма да отидат в стека и никога няма да получат числа.

Факт е, че когато премахвате върхове и дъги от неконтролирана графика, винаги получавате неконтролирана графика и в нея има поне един връх, без да влизат дъги в нея. Следователно всеки връх определено ще влезе в стека и ще получи съответното число.

Тъй като произволен връх се изскача от стека, принципът на стека не е задължителен и е избран само за удобство.

Данни: Безконтурен диграф G= дадено от списъци с честота SLED[v], v Î V.

Резултати: За всеки връх v нов номер [v] такива, че числата [v] са правилното номериране на графиката G.

2 за vÎV направете INP [v]: = 0;

4 за vÎSLED [u] do

8 ако INP [v] = 0, тогава STACK Ü v;

10 докато STACK <> 0 направи

15 за vÎSLED [u] do

18 ако INP [v] = 0, тогава STACK Ü v;

Всички дъги на графиката се анализират два пъти: в цикъл 3-5, за да се преброи броят на входящите дъги INP[v], в цикъл 10–20, където премахването на дъги от графиката се заменя с намаляване на числата INP[v].

По този начин изчислителната сложност на алгоритъма е пропорционална на броя на дъгите, т.е. се равнява ОТНОСНО(м) стъпки.