Graf düğümlerini öncelik kuyruğu kullanarak belirli ağırlıklara göre ziyaret eden Öncelik Öncelikli Dolaşma (PFS) ve çevrim tespiti (Cycle Testing) yöntemleridir.
Graf dolaşma algoritmaları, graf yapısındaki tüm düğüm ve kenarların belirli bir sırada ziyaret edilmesini sağlar. BFS ve DFS temel dolaşma yöntemleridir.
Öncelik Öncelikli Dolaşma (PFS - Priority-First Search), kuyruk yerine bir öncelik kuyruğu kullanarak bir sonraki ziyaret edilecek düğümü kenar ağırlıklarına göre dinamik olarak seçer. Sedgewick notlarında bu yöntem, seyrek graflarda adjacency list ile O(E log V) (Sparse PFS), yoğun graflarda ise adjacency matrix ile O(V^2) (Dense PFS) zamanda çalışacak şekilde iki varyantta optimize edilir.
Çevrim Testi (Cycle Testing) ve tüm çevrimleri dolaşma şemaları, grafın DFS ile taranması sırasında ebeveyn olmayan, daha önce ziyaret edilmiş bir düğüme geri yönlü kenar (back edge) bulunup bulunmadığını kontrol ederek çevrimleri doğrular.
Aşağıdaki uygulamalar PDF kaynaklarındaki pseudo kod akışını modern veri yapılarıyla ifade eder. Kenar durumları görünür bırakıldığı için örnekler doğrudan test edilebilir.
1function hasCycleDFS(adjList: Map, node: number, visited: Set, recStack: Set, parent: number | null = null): boolean { 2 visited.add(node);3 recStack.add(node);45 const neighbors = adjList.get(node) ?? [];6 for (const neighbor of neighbors) {7 if (!visited.has(neighbor)) {8 if (hasCycleDFS(adjList, neighbor, visited, recStack, node)) return true;9 } else if (recStack.has(neighbor) && neighbor !== parent) {10 return true; // Back edge bulduk, çevrim var11 }12 }1314 recStack.delete(node);15 return false;16}1718function detectCycle(n: number, edges: [number, number][]): boolean {19 const adjList = new Map(); 20 for (const [u, v] of edges) {21 if (!adjList.has(u)) adjList.set(u, []);22 if (!adjList.has(v)) adjList.set(v, []);23 adjList.get(u)!.push(v);24 adjList.get(v)!.push(u); // Un-directed graf varsayımı25 }2627 const visited = new Set(); 28 const recStack = new Set(); 2930 for (let i = 0; i < n; i++) {31 if (!visited.has(i)) {32 if (hasCycleDFS(adjList, i, visited, recStack)) return true;33 }34 }35 return false;36}Düğüm sayısını ve kenarları girin. Çevrim test edilecektir. Örnek: 4; 0-1, 1-2, 2-3, 3-0
Düğüm sayısını ve kenarları girin. Çevrim test edilecektir. Örnek: 4; 0-1, 1-2, 2-3, 3-0
En İyi Durum: O(V + E)
Ortalama Durum: O(V log V + E)
En Kötü Durum: O(V^2) yoğun graflarda
O(V + E) adj listesi ve ziyaretçi yığınları - Bu algoritmanın karmaşıklığı belirtilmemiş.
Graf Dolaşma ve Arama (Graph Traversals & Searching) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: