Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

อัลกอริทึมของ Tarjan สำหรับส่วนประกอบที่เชื่อมต่ออย่างแน่นหนา


อัลกอริธึมของ Tarjan ใช้เพื่อค้นหาองค์ประกอบที่เชื่อมโยงอย่างมากของกราฟที่มีทิศทาง ต้องใช้การข้ามผ่าน DFS เพียงหนึ่งครั้งเพื่อใช้อัลกอริทึมนี้

อัลกอริทึมของ Tarjan สำหรับส่วนประกอบที่เชื่อมต่ออย่างแน่นหนา

การใช้ DFS traversal เราจะสามารถค้นหา DFS tree ของป่าได้ จากแผนผัง DFS จะพบส่วนประกอบที่เชื่อมต่ออย่างแน่นหนา เมื่อพบรูทของทรีย่อยดังกล่าว เราสามารถแสดงทรีย่อยทั้งหมดได้ ทรีย่อยนั้นเป็นองค์ประกอบที่เชื่อมต่อกันอย่างมาก

อินพุตและเอาต์พุต

Input:Adjacency matrix of the graph.0 0 1 1 01 0 0 0 00 1 0 0 00 0 0 0 10 0 0 0 0Output:ส่วนประกอบที่เชื่อมต่ออย่างแน่นหนา:431 2 0

อัลกอริทึม

findComponent(u, disc, low, stack, stackItemFlag)

อินพุต: โหนดเริ่มต้น เวลาค้นพบ ต่ำ แผ่นดิสก์จะเก็บเวลาการค้นพบของจุดยอด และระดับต่ำจะเก็บข้อมูลเกี่ยวกับทรีย่อย สแต็กเพื่อเก็บจุดยอดและอาร์เรย์ธงอื่นเพื่อติดตามว่าโหนดใดอยู่ในสแต็ก

ผลลัพธ์: แสดง SCC

Begin time :=0 //ค่าของเวลาจะไม่ถูกเตรียมใช้งานสำหรับการเรียกใช้ฟังก์ชันถัดไป set disc[u] :=time+1 and low[u] :=time + 1 time :=time + 1 push u ลงใน stack stackItemFalg[u] :=true สำหรับจุดยอด v ทั้งหมดที่อยู่ติดกับ u ให้ทำถ้าไม่พบ v จากนั้น fincComponent(v, disc, low, stack, stackItemFalg) low[u] =ต่ำสุดที่ต่ำ[u] และ low[v] else ถ้า stackItemFalg[v] เป็นจริง ดังนั้น low[u] :=ขั้นต่ำของ low[u] และ disc[v] ก็เสร็จแล้ว poppedItem :=0 if low[u] =disc[u] จากนั้นในขณะที่ คุณไม่ได้อยู่ในสแต็กด้านบน ทำ poppedItem :=ด้านบนของสแต็กแสดง poppedItem stackItemFlag[poppedItem] :=รายการป๊อปปลอมจากสแต็คเสร็จแล้ว poppedItem :=ด้านบนของสแต็กแสดง poppedItem stackItemFlag[poppedItem] :=รายการป๊อปปลอมจาก stackEnd 

strongConComponent(กราฟ)

อินพุต &,ลบ; กราฟที่กำหนด

ผลลัพธ์ − ส่วนประกอบที่เชื่อมต่อกันอย่างแน่นหนาทั้งหมด

เริ่มแรกตั้งค่ารายการทั้งหมดในอาร์เรย์ดิสก์เป็น undiscovered สำหรับองค์ประกอบทั้งหมดในระดับต่ำถึง φ และทำเครื่องหมายว่าไม่มีรายการใดถูกจัดเก็บไว้ในสแต็กสำหรับโหนด i ทั้งหมดในกราฟ ถ้าไม่พบดิสก์[i] จากนั้น findComponent( i, ดิสก์, ต่ำ, สแต็ค, stackItemFlag)สิ้นสุด

ตัวอย่าง

#include#include#define NODE 5using เนมสเปซ std; กราฟ int[NODE][NODE] ={ {0, 0, 1, 1, 0}, {1, 0, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 0 , 0, 0, 1}, {0, 0, 0, 0, 0}}; int min (int a, int b) { return (a&stk, bool stkItem[]) { เวลาคงที่คงที่ =0; ดิสก์[u] =ต่ำ[u] =++เวลา; // เวลาในการค้นพบครั้งแรกและค่าต่ำคือ 1 stk.push(u); stkItem[u] =จริง; // ตั้งค่าสถานะเป็น u ในสแต็กสำหรับ (int v =0; v stk; สำหรับ (int i =0; i 

ผลลัพธ์

431 2 0