การสร้างกราฟ C++ Boost แบบไม่กำหนดทิศทางและทำการค้นหาแบบลึก (DFS)
ทฤษฎีกลุมนับเป็นพื้นที่สำคัญในวิทยาการคอมพิวเตอร์และการเขียนโปรแกรม และหนึ่งในไลบรารีที่ใช้กันอย่างแพร่หลายในการนำอัลกอริธึมกราฟไปใช้ใน C++ คือ Boost
ในบล็อกโพสต์นี้ เราจะมาพิจารณาความท้าทายในการสร้างกราฟแบบไม่กำหนดทิศทางโดยใช้ไลบรารี Boost และจากนั้นทำการค้นหาในกราฟนี้ด้วยวิธีค้นหาแบบลึก (DFS)
บทนำสู่ปัญหา
การสร้างและทำงานกับกราฟอาจเป็นเรื่องน่ากลัว แต่ด้วย Boost จะทำให้มันง่ายขึ้นมาก วิธีค้นหาแบบลึก (DFS) เป็นอัลกอริธึมพื้นฐานที่ใช้เพื่อสำรวจโหนดและขอบของกราฟ ไม่ว่าคุณจะมองหาทางเดิน ตรวจสอบการเชื่อมต่อ หรือแก้ปัญหา DFS เป็นวิธีที่มีประสิทธิภาพในการนำทางผ่านกราฟ
ในโพสต์นี้ เราจะสำรวจตัวอย่างที่ชัดเจนในการตั้งค่ากราฟแบบไม่กำหนดทิศทางและการดำเนินการค้นหาแบบลึก (DFS)
ภาพรวมของวิธีแก้ปัญหา
เราจะครอบคลุมขั้นตอนดังต่อไปนี้:
- รวมเฮดเดอร์ Boost ที่จำเป็น
- กำหนดโครงสร้างกราฟ
- สร้างคลาสผู้เยี่ยมชมเพื่อจัดการการค้นพบโหนด
- ตั้งค่าฟังก์ชันหลักเพื่อสร้างกราฟและดำเนินการ DFS
ขั้นตอนที่ 1: รวมเฮดเดอร์ Boost ที่จำเป็น
เริ่มต้นคุณต้องรวมเฮดเดอร์กราฟ Boost ซึ่งจะให้คลาสและฟังก์ชันพื้นฐานสำหรับการทำงานที่เกี่ยวข้องกับกราฟ
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <iostream>
ขั้นตอนที่ 2: กำหนดโครงสร้างกราฟ
เราจะกำหนดกราฟแบบไม่กำหนดทิศทางของเราโดยใช้ boost::adjacency_list
ดังนี้:
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS> MyGraph;
typedef boost::graph_traits<MyGraph>::vertex_descriptor MyVertex;
- ในโค้ดข้างต้น:
listS
ระบุว่ากราฟจะใช้รายการของขอบvecS
หมายความว่าเราจะใช้เวกเตอร์ในการเก็บโหนดundirectedS
ระบุว่ากราฟนี้เป็นแบบไม่กำหนดทิศทาง
ขั้นตอนที่ 3: สร้างคลาสผู้เยี่ยมชม
คลาสผู้เยี่ยมชมมีความสำคัญในการกำหนดสิ่งที่จะเกิดขึ้นเมื่อมีการค้นพบโหนดระหว่างการค้นหาแบบลึก (DFS) นี่คือตัวอย่างคลาสผู้เยี่ยมชมที่เรียบง่าย:
class MyVisitor : public boost::default_dfs_visitor {
public:
void discover_vertex(MyVertex v, const MyGraph& g) const {
std::cerr << v << std::endl; // แสดงเลขโหนด
return;
}
};
ขั้นตอนที่ 4: ตั้งค่าฟังก์ชันหลัก
สุดท้ายเราต้องสร้างกราฟ เพิ่มขอบ และเรียกใช้ขั้นตอน DFS
int main() {
MyGraph g;
boost::add_edge(0, 1, g); // เชื่อมโหนด 0 และ 1
boost::add_edge(0, 2, g); // เชื่อมโหนด 0 และ 2
boost::add_edge(1, 2, g); // เชื่อมโหนด 1 และ 2
boost::add_edge(1, 3, g); // เชื่อมโหนด 1 และ 3
MyVisitor vis;
boost::depth_first_search(g, boost::visitor(vis)); // ดำเนินการค้นหาแบบลึก (DFS)
return 0;
}
คำอธิบายของโค้ด
- การสร้างกราฟ: เราสร้างอินสแตนซ์ของ
MyGraph
ชื่อว่าg
จากนั้นเราเพิ่มขอบเพื่อระบุการเชื่อมต่อระหว่างโหนด - การดำเนินการค้นหาแบบลึก (DFS): โดยการสร้างอินสแตนซ์ของ
MyVisitor
เราส่งไปเป็นผู้เยี่ยมชมที่จะใช้กับdepth_first_search
ซึ่งจะทำการสำรวจกราฟและเรียกใช้discover_vertex
สำหรับแต่ละโหนด
สรุป
การใช้ไลบรารี Boost ในการสร้างและสำรวจกราฟสามารถช่วยให้การทำงานที่ซับซ้อนใน C++ ง่ายขึ้นอย่างมาก โดยการปฏิบัติตามขั้นตอนที่กล่าวถึงข้างต้น คุณสามารถนำวิธีค้นหาแบบลึก (DFS) ไปใช้งานบนกราฟแบบไม่กำหนดทิศทางได้อย่างสำเร็จ
การใช้งานจริงของกราฟนั้นกว้างขวาง และการทำความเข้าใจกับ DFS เป็นสิ่งสำคัญสำหรับผู้ที่ต้องการลงลึกไปยังอัลกอริธึมกราฟ ทดลองกับโค้ดนี้และปรับโครงสร้างกราฟให้เหมาะกับความต้องการของคุณ!