სიღრმეში ძებნის ალგორითმი (Depth-
  First Search, DFS), ციკლის პოვნა
       გრაფში (Cycle Detection).
ტოპოლოგიური დალაგება (Topological
                 Sort).

           მარიამ გობრონიძე
DFS
სიღრმეში ძებნის ალგორითმი იწყებს გრაფის წვეროების
შემოვლას ნებისმიერი წვეროდან, ყოველ იტერაციაზე
ალგორითმი გადადის მიმდინარე წვეროს მოსაზღვრე წვეროზე
და ეს პროცესი გრძელდება მანამ, სანამ არ მიაღწევს ჩიხს
(მდგომარეობა, როცა წვეროს არ ჰყავს გაუვლელი მოსაზღვრე
მეზობელი). ამ შემთხვევაში, ალგორითმი ბრუნდება ერთი
წიბოთი უკან, წვეროში, რომლიდანაც ის მოხვდა ჩიხში და
პროცესი გრძელდება ამ ადგილიდან.
ალგორთმი სრულდება, როცა ბრუნდება საწყის წვეროში,
რომელსაც უკვე არ გააჩნია გაუვლელი მეზობლები. თუ გრაფში
დარჩენილია მოუნახულებელი წვეროები, ალგორითმი ირჩევს
ერთ-ერთ მათგანს და პროცესი მეორდება.
სტრატეგია
•   ვიაროთ გრაფში წინ, სანამ არსებობს გაუვლელი წიბო.
•   თუ გაუვლელი წიბო არ არსებობს დავბრუნდეთ უკან და
    ვეძებოთ სხვა გზა.
•   ასე გრძელდება წვეროების ამოწურვამდე, რომელიც
    მიღწევადია საწყისი წვეროდან
•   თუ გაუვლელი წვეროები მაინც დარჩა, ავიღოთ ერთ-ერთი
    და პროცესი გავიმეოროთ, სანამ გრაფის ყველა წვეროს არ
    შემოვივლით
ბმული გრაფი
ორიენტირებულ გრაფს ეწოდება ძლიერად ბმული (strongly
connected), თუკი მისი ნებისმიერი წვეროდან მიღწევადია
(ორიენტირებული გზებით) ნებისმიერი სხვა წვერო.
ნებისმიერი ორიენტირებული გრაფი შეიძლება დაიყოს
ძლიერად ბმულ კომპონენტებად.
DFS იწყებს წვეროდან s

აღნიშნავს მას როგორც მონახულებულს: visited[s] = True

ამატებს მას შედეგის სიაში: res

გადადის ყველა დაკავშირებულ წვეროზე i, თუ ჯერ არ არის მონახულებული
სირთულის შეფასება
დროითი სირთულე: O(V + E)

დამხმარე მეხსიერება: O(V + E)
DFS არაბმული გრაფებისათვის
იდეა მარტივია — იმის ნაცვლად, რომ DFS მხოლოდ ერთ
კონკრეტულ წვეროზე გამოვიძახოთ, DFS ვიძახებთ ყოველი ჯერ
კიდევ მოუნახულებელი წვეროსთვის, ერთი მეორეს
მიყოლებით.
სირთულის შეფასება
დროითი სირთულე: O(V + E)

დამხმარე მეხსიერება: O(V + E)
ციკლი
ორიენტირებულ გრაფში ციკლი (cycle) ეწოდება გზას,
რომელშიც საწყისი წვერო ემთხვევა ბოლო წვეროს და
რომელიც ერთ წიბოს მაინც შეიცავს. ციკლს ეწოდება მარტივი,
თუკი მასში არ მეორდება არც ერთი წვერო პირველისა და
ბოლოს გარდა. მარყუჟი წარმოადგენს ციკლს სიგრძით 1.
გრაფს, რომელშიც არაა ციკლები, აციკლური (acyclic) ეწოდება.
ციკლის აღმოჩენა მიმართულ გრაფში
უკუმიმართული წიბოს (back edge) აღმოჩენისთვის საჭიროა
დავიმახსოვროთ ის წვეროები, რომლებიც ამჟამად რეკურსიის
სტეკში არიან [ანუ იმ ბილიკზე, რომელსაც ამჟამად
ვამუშავებთ]. გაითვალისწინეთ, რომ DFS-ის დროს წვეროს
ყველა წინაპარი იმყოფება რეკურსიის გამოძახების სტეკში.
ამიტომ, თუ არსებობს წიბო რომელიმე წინაპრისკენ, მაშინ ეს
უკუმიმართული წიბოა.
სირთულის შეფასება

დროითი სირთულე: O(V + E) — ამ მეთოდის დროითი სირთულე იგივეა, რაც DFS-ით
გრაფის შემოვლის დროითი სირთულე, ანუ O(V + E).

დამატებითი მეხსიერება: O(V) — ვიზიტების მასივისა და რეკურსიის სტეკის შესანახად
საჭიროა O(V) დამატებითი მეხსიერება.
ტოპოლოგიური დალაგება
ორიენტირებული აციკლური გრაფის წვეროების ტოპოლოგიური დალაგება
ეწოდება გრაფის წვეროების ისეთ წყობას:




სადაც სრულდება შემდეგი პირობა: თუ v_i გრაფის წვეროდან წიბო
მიმართულია v_j წვეროსკენ, მაშინ მიმდევრობაში
i წვერო j წვერომდეა მოთავსებული.
ტოპოლოგიური დალაგება
ცხადია, რომ თუკი გრაფი შეიცავს ციკლს, ასეთი
თანმიმდევრობა არ იარსებებს.
შენიშვნა
ტოპოლოგიური დალაგება არაა ცალსახა (შესაძლოა ერთი და
იმავე გრაფი სხვადასხვანაირად დალაგდეს ტოპოლოგიური
დალაგებით).
ტოპოლოგიური დალაგება vs DFS

DFS-ის დროს, ჯერ ვბეჭდავთ კვანძს და შემდეგ რეკურსიულად ვიძახებთ DFS-ს მისი
მიმდებარე კვანძებისთვის. ტოპოლოგიური სორტირებისას კი, აუცილებელია, რომ
კვანძი დაიბეჭდოს მანამდე, სანამ მისი მიმდებარე კვანძები დაიბეჭდებიან.

მაგალითად, ზემოთ მოცემულ გრაფში, კვანძი ‘5’ უნდა დაიბეჭდოს კვანძ ‘0’-მდე, მაგრამ
განსხვავებით DFS-ისგან, კვანძი ‘4’-ც უნდა დაიბეჭდოს ‘0’-მდე. ამიტომ,
ტოპოლოგიური სორტირება DFS-ისგან განსხვავდება. მაგალითად, ამ გრაფის DFS
შეიძლება იყოს "5 2 3 1 0 4".
ტოპოლოგიური სორტირება
ორიენტირებულ უციკლო გრაფებში (DAG-
ებში)
DAG-ები წარმოადგენს გრაფების განსაკუთრებულ ტიპს, სადაც
ყველა წვერი მიმართულია ისე, რომ ციკლი არ არსებობს.
ტოპოლოგიური სორტირება არსებობს მხოლოდ DAG-ებიში.
ტოპოლოგიური სორტირება და
არაორიენტირებული გრაფები
არაორიენტირებულ გრაფებში თუ u-სა და v-შორის გვაქვს გზა,
მაშინ v-დან u-შიც არსებობს იგი. შესაბამისად, ორივე კვანძი
ერთმანეთზეა დამოკიდებული და ვერცერთი ვერ მოხვდება
მეორეზე ადრე ტოპოლოგიურ დალაგებაში, ისე რომ არ
გამოიწვიოს წინააღმდეგობა.
ციკლები და ტოპოლოგიური
სორტირება
წარმოიდგინეთ გრაფი 3 კვანძით და წიბოებით: {1 → 2, 2 → 3, 3
→ 1}. ეს გრაფი ქმნის ციკლს. თუ ვცდილობთ ამ გრაფის
ტოპოლოგიური სორტირებას რომელიმე კვანძიდან,
ყოველთვის მივდივართ წინააღმდეგობამდე. ციკლში ყველა
კვანძი ერთმანეთზე არაპირდაპირაა დამოკიდებული, ამიტომ
ტოპოლოგიური სორტირება შეუძლებელია.
ტოპოლოგიური თანმიმდევრობა
შესაძლოა უნიკალური არ იყოს
ტოპოლოგიური სორტირება წარმოადგენს
დამოკიდებულებებზე დაფუძნებულ ამოცანას, სადაც ერთი
ამოცანის შესრულება დამოკიდებულია სხვა ამოცანების
შესრულებაზე, თუმცა მათი რიგითობა შეიძლება
განსხვავებული იყოს.
მაგალითი
დავუშვათ, ჩვენი მიზანია სკოლაში წასვლა. ამისთვის საჭიროა
ჩაცმა. ქვემოთ მოცემულია გრაფი ტანსაცმლის ჩაცმის
რიგითობისთვის. მაგალითად, წინდების ჩაცმამდე ფეხსაცმლის
ჩაცმა შეუძლებელია.
ვარიანტები
ალგორითმის დეტალური აღწერა
შექმენი გრაფი n წვეროთი და m წიბოთი.

შექმენი ცარიელი სტეკი და visited მასივი ზომით n

ყოველი მოუნახულებელი კვანძისთვის გრაფში, შეასრულე შემდეგი
მოქმედება:


 ● გამოიძახე DFS ფუნქცია ამ კვანძით.
ალგორითმის დეტალური აღწერა
DFS ფუნქციაში:

 ●   მონიშნე კვანძი როგორც "ნანახი".

 ●   რეკურსიულად გამოიძახე DFS მისი ყველა იმ მეზობელი კვანძისთვის, რომლებიც
     ჯერ არ არის მონიშნული.

 ●   მას შემდეგ, რაც ყველა მეზობელ კვანძა შემოვვლით, გადაიტანე(push) მიმდინარე
     კვანძი სტეკში.

მას შემდეგ რაც ყველა კვანძს შემოვივლით, ამოიღე (pop) სტეკიდან ელემენტები და
დაამატე შედეგების სიაში მანამ, სანამ სტეკი ცარიელი გახდება.
სირთულის შეფასება

დროითი სირთულე: O(V + E) — ამ მეთოდის დროითი სირთულე იგივეა, რაც DFS-ით
გრაფის შემოვლის დროითი სირთულე, ანუ O(V + E).

დამატებითი მეხსიერება: O(V) — რეკურსიის სტეკის შესანახად საჭიროა O(V)
დამატებითი მეხსიერება.
ციკლების აღმოჩენა ტოპოლოგიური
დალაგების გამოყენებით
ალგორითმი იყენებს ტოპოლოგიურ დალაგებას გრაფში
ციკლების აღმოსაჩენად, თუ ეს ალგორითმი წარმატებით
ამოშლის ყველა წვეროს, მაშინ გრაფი აციკლური და
ორიენტირებული (DAG) ყოფილა.
თუ დარჩება წვეროები, რომელთა შემომავალი ხარიხიც (წვეროს
შემომავალი წიბოების რაოდენობა) აჭარბებს 0-ს, ეს მიუთითებს
გრაფში სულ მცირე ერთი ციკლის არსებობაზე.
ამგვარად თუ გრაფის ყველა წვეროს ტოპოლოგიური დავალება
შეუძლებელია, მაშინ გრაფში ყოფილა სულ მცირე ერთი ციკლი
მაინც
გმადლობთ ყურადღებისთვის!
