การสร้างกราฟ C++ Boost แบบไม่กำหนดทิศทางและทำการค้นหาแบบลึก (DFS)

ทฤษฎีกลุมนับเป็นพื้นที่สำคัญในวิทยาการคอมพิวเตอร์และการเขียนโปรแกรม และหนึ่งในไลบรารีที่ใช้กันอย่างแพร่หลายในการนำอัลกอริธึมกราฟไปใช้ใน C++ คือ Boost ในบล็อกโพสต์นี้ เราจะมาพิจารณาความท้าทายในการสร้างกราฟแบบไม่กำหนดทิศทางโดยใช้ไลบรารี Boost และจากนั้นทำการค้นหาในกราฟนี้ด้วยวิธีค้นหาแบบลึก (DFS)

บทนำสู่ปัญหา

การสร้างและทำงานกับกราฟอาจเป็นเรื่องน่ากลัว แต่ด้วย Boost จะทำให้มันง่ายขึ้นมาก วิธีค้นหาแบบลึก (DFS) เป็นอัลกอริธึมพื้นฐานที่ใช้เพื่อสำรวจโหนดและขอบของกราฟ ไม่ว่าคุณจะมองหาทางเดิน ตรวจสอบการเชื่อมต่อ หรือแก้ปัญหา DFS เป็นวิธีที่มีประสิทธิภาพในการนำทางผ่านกราฟ

ในโพสต์นี้ เราจะสำรวจตัวอย่างที่ชัดเจนในการตั้งค่ากราฟแบบไม่กำหนดทิศทางและการดำเนินการค้นหาแบบลึก (DFS)

ภาพรวมของวิธีแก้ปัญหา

เราจะครอบคลุมขั้นตอนดังต่อไปนี้:

  1. รวมเฮดเดอร์ Boost ที่จำเป็น
  2. กำหนดโครงสร้างกราฟ
  3. สร้างคลาสผู้เยี่ยมชมเพื่อจัดการการค้นพบโหนด
  4. ตั้งค่าฟังก์ชันหลักเพื่อสร้างกราฟและดำเนินการ 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 เป็นสิ่งสำคัญสำหรับผู้ที่ต้องการลงลึกไปยังอัลกอริธึมกราฟ ทดลองกับโค้ดนี้และปรับโครงสร้างกราฟให้เหมาะกับความต้องการของคุณ!