1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận lý thuật Đồ thị duyệt Đồ thị theo chiều rộng bfs

13 0 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lý Thuyết Đồ Thị Duyệt Đồ Thị Theo Chiều Rộng BFS
Tác giả Nguyễn Phước Thịnh, Ngô Thành Hữu, Huỳnh Ngọc Phúc, Nguyễn Duy Trường, Phạm Ngọc Anh Khôi, Phạm Đỗ Hoàng Luân, Lê Quốc Huy, Nguyễn Hoang Duy
Người hướng dẫn ThS. Lê Tuấn Thu
Trường học Trường Đại Học Tài Nguyên Và Môi Trường
Chuyên ngành Hệ Thống Thông Tin
Thể loại tiểu luận
Năm xuất bản 2024
Thành phố Thành Phố Hồ Chí Minh
Định dạng
Số trang 13
Dung lượng 713,25 KB

Nội dung

MỞ ĐẦU Lý thuyết đồ thị là một nhánh của toán học nghiên cứu các đối tượng gọi là đồ thị, bao gồm các đỉnh hay còn gọi là nút và các cạnh hay còn gọi là đường nối giữa chúng.. Môn học Lý

Trang 1

TRƯỜNG ĐẠI HỌC TÀI NGUYÊN VÀ MỖI TRƯỜNG

THÀNH PHÓ HỎ CHÍ MINH ; KHOA HE THONG THONG TIN VA VIEN THAM

_ TIEU LUAN

LÝ THUẬT ĐỎ THỊ

DUYET DO THI THEO CHIEU RONG BFS

Lớp : II ĐH HTTT Khoá : 2022-2026 Giảng viên hướng dẫn : ThS Lê Tuấn Thu

TP Hồ Chí Minh, tháng 3 năm 2024

Trang 2

DACH SÁCH TÊN CÁC THÀNH VIÊN NHÓM 5

STT Họ và Tên Mã số sinh viên

5 Phạm Ngọc Anh Khôi 1150070023

Trang 3

MỤC LỤC

¡1010000 0

N/I9E5; t9gi

Chương l: TỎNG QUAN ccSn 21111 121 2112122121211 ng He

Chuong 2: DUYET DO TH] THEO CHIEU RỘNG BEFS 5S nen re

2.1 Khái niệm và cấu trúc dữ liệu -2222+2222t222112211122211212112121 2111 xe

2.2 _ 5oucre code của duyệt dé thi theo chiều rộng sử dụng danh sách kề

2.3 KẾtQquả 20.201 HH HH n1 1212k TAIT LIEU THAM KHẢO - 5 S1 2E 1112211211211 121112 1 1121 ng tr He

Trang 4

MỞ ĐẦU

Lý thuyết đồ thị là một nhánh của toán học nghiên cứu các đối tượng gọi là đồ thị, bao gồm các đỉnh (hay còn gọi là nút) và các cạnh (hay còn gọi là đường nối) giữa chúng Đồ thị có thê được sử dụng đề mô hình hóa nhiều loại quan hệ và cấu tric trong khoa học tự nhiên và xã hội, như mạng lưới giao thông, mạng xã hội, mạng máy tính, mạng thông tin, v.v

Môn học Lý Thuyết Đồ Thị giúp sinh viên nắm vững các khái niệm cơ bản, các định lý và các thuật toán quan trọng trong lý thuyết đồ thị, như đỗ thị liên thông, đồ thị Euler, đồ thị Hamilton, đồ thị phẳng, đồ thị hai phía, đồ thị phân chia, đồ thị cây, mã hoá Huffman, thuật toán DiJkstra, thuật toán Prim, thuật toán Kruskal, v.v Môn học cũng giúp sinh viên phát triển kỹ năng phân tích và giải quyết các bải toán thực tế có liên quan đến lý thuyết đồ thị, như bài toán du lịch, bài toán phân công công việc, bài toán tô màu bản đồ, v.v

Môn học Lý Thuyết Đồ Thị yêu cầu sinh viên có kiến thức nền tảng về toán rời rạc và lập trình Môn học bao gồm các bài giảng lý thuyết, các bài tập lớn và các bài kiểm tra Sinh viên sẽ được đánh giá dựa trên điểm số của các bài tập lớn và các bài kiêm tra

Trang |

Trang 5

Chương 1: TỎNG QUAN

1.1 Lý do chọn đề tài

Nhóm chúng em quyết định chọn đề tai này vi nhận thấy được các mặt lợi ích của duyệt đỗ thị theo chiều rộng BES bao gom các tiêu chí sau: “tầm quan trọng”, “tính ứng dụng cao”, “dé hiéu và đễ triên khai”, “hiểu quả và linh hoạt”

-Về tầm quan trọng, duyệt đỗ thị theo chiều rộng (BFS) là một thuật toán cơ bản và thiết yếu trong khoa học máy tính, được sử dụng dé giải quyết nhiều bài toán liên quan đến đồ thị BES có nhiều ứng dụng thực tế trong nhiều lĩnh vực như mạng lưới máy tính, mạng xã hội, bản đồ, v.v và việc hiểu rõ về BEFS giúp nâng cao tư duy logic và khả năng giải quyết vấn đề của người học

-Về tính ứng dụng cao, thì BES có thê được sử dung dé giai quyét nhiéu bai toan khac nhau như: tìm kiếm đường đi ngắn nhất giữa hai điểm trong một mạng lưới, kiểm tra tính liên thông của một đồ thị, tìm chu trình Euler trong một đồ thị, tìm tất cả các đỉnh

có thể đi đến từ một đỉnh cho trước, xác định thành phần liên thông của một dé thi

-Vé viéc dé hiéu va dé trién khai, thì so với các thuật toán duyệt đồ thị khác, BFS có

cách thức hoạt động đơn giản và dễ hiểu, BFS có thể được triển khai dễ dàng bằng nhiều ngôn ngữ lập trình khác nhau như C/C++, Cử

-Về sự hiểu qua va lĩnh hoạt, BFS có hiệu quả cao trong nhiều trường hợp và có thể được mở rộng đề giải quyết các bài toán phức tạp hơn

*Đối tượng nghiên cứu:

- Thuật toán duyệt dé thi theo chiều rộng bằng danh sách kề

*Pham vi nghiên cứu:

- Các khái niệm cơ bản, các thuật toán nằm trong vùng kiến thức của môn Lý Thuyết

Đồ Thị và ứng dụng

- Mô tả thuật toán bằng ngôn ngữ lập trình C++

Trang 2

Trang 6

Chương 2: DUYET DO THI THEO CHIEU RONG BFS

- DO thị: Đồ thị được định nghĩa là một tập hợp các đỉnh (vertex) và các canh (edge) nối các đỉnh với nhau, các loại đỗ thị bao gồm đồ thị vô hướng (undirected graph) và d6 thi co hung (directed graph), phy thuéc vào cách các cạnh kết nối Các khái niệm

cơ bản trong đỗ thị bao gồm dinh ké (adjacent vertex), bac cua mét dinh (degree of a vertex), d6 thi con (subgraph), duong di (path), chu trinh (cycle), va tính liên thông (connectivity)

-Danh sach ké: Danh sach ké chứa một danh sách các đỉnh kề với mỗi đỉnh trong đồ thị Quá trình hiện thực bao gồm khởi tạo một danh sách có kích thước bằng số lượng đỉnh Duyệt qua danh sách cạnh và thêm các đỉnh kề vào danh sách tương ứng với đỉnh xuất phát của cạnh

-Duyệt theo chiều rộng (Breadth-First Search - BES) là một trong những thuật toán cơ bản và quan trọng trong lý thuyết đồ thị BES bắt đầu từ một đỉnh nguồn và duyệt qua tất cả các đỉnh có thể đạt được từ nguồn theo chiều rộng của đồ thị Đây là một phương pháp tìm kiếm không đệ quy, sử dụng cấu trúc dữ liệu hàng đợi để lưu trữ các đỉnh cần duyệt

- Ý tưởng chinh cua BFS: BFS duyét các đỉnh theo cap độ từ đỉnh nguồn Đầu tiên, nó thăm đỉnh nguồn, sau đó là tất cả các đỉnh kề với nguồn, tiếp theo là các đỉnh kề với các đỉnh đã thăm, và cứ tiếp tục như vậy cho đến khi tất cả các đỉnh trong thanh phan liên thông với đỉnh nguồn được thăm

-Cách thức hoạt động của duyệt dé thi theo chiều rộng BES:

hàng đợi Q

o_ Lấy đỉnh đầu tiên trong Q ra và xem xét nó

Duyệt qua tat cả các đỉnh kề với đỉnh đang xét

Nếu một đỉnh kề chưa được thăm, đánh dấu nó là đã thăm và đưa vào Q Lap lai quá trình trên cho dén khi hang doi Q rỗng

Cấu trúc dữ liệu

I Cấu trúc Graph biểu điễn đồ thị: Cấu trúc Graph được sử dụng để biểu diễn đồ thị trong chương trình Cấu trúc này bao gồm hai thành phân chính:

Ví dụ:

C++

struct Graph{

vector<vector<int>> adj;

1nt n; /⁄ lưu đỉnh

Graph(mt n) {

this->n =n;

adj.resize(n + 1);

Trang 3

Trang 7

}

void addEdge(int u, int v){

adj[u].push_back(v);

adj[v].push_back(u);

}

b

2_.Cấu trúc vector: Cấu trúc vector là một mảng động có thé thay đổi kích thước Cấu trúc này được sử dụng để lưu trữ danh sách các đỉnh kề với mỗi đỉnh trong mảng adj của cấu trúc Graph

-Đặc điểm:

không cần khai báo kích thước ban đầu

cập trực tiếp bằng chỉ sô

gom kiêu đữ liệu cơ bản và kiểu dữ liệu do người dùng định nghĩa

Vi du: Ma code minh hoa str dung vector trong cau tric Graph:

C++

#include <iostream>

#include <vector>

using namespace std;

// Khai báo cầu trúc Graph

struct Graph {

vector<vector<int>> adj;

1nt n; /⁄ lưu đỉnh

Graph(mt n) {

this->n =n;

adj.resize(n + 1);

void addEdge(int u, int v) {

adj[u].push_back(v);

adj[v].push_back(u);

}

}:

⁄/ Hàm duyệt đồ thị theo chiều rộng (BFS)

void BFS(Graph& g, int x) {

// Khai bao hang doi

queue<int> q;

// Danh dau dinh xuat phat di duge duyét

vector<bool> visited(g.n + 1, false);

visited[x] = true;

Trang 4

Trang 8

// Thêm đỉnh xuất phát vào hàng đợi

q.push(x);

/IDuyệt cho đến khi hàng đợi rỗng

while (!q.empty()) {

// Lay dinh đầu tiên ra khỏi hàng đợi

int u = q.front();

q.popQ:

//Inra dinh u

cout <<u <<" ":

// Duyệt qua các đỉnh kề với u

for (int v : g.adj[u]) {

// Néu đỉnh v chưa được duyệt và v hợp lệ

if (!visited[v] && v <=g.n) {

// Đánh dấu đỉnh v đã được duyệt

visited[v] = true;

// Thém dinh v vao hang doi

q.push(v);

b

3.Cau tric Queue: Queue 1a m6t cau trúc dữ liệu theo nguyên tắc "fñirst-in-frst-out" (FIFO) trong C++ Nó hoạt động như một hàng đợi, nơi các phần tử được thêm vào một đầu và lấy ra từ đầu kia

-Đặc điểm:

e Hiéu qua: Thém va xoa phan tv rat hiệu qua

Vị dụ: Mã code minh họa sử dung queue trong thuat toan BFS:

C++

#include <iostream>

#include <vector>

#include <queue>

using namespace std;

// Khai báo cầu trúc Graph

struct Graph {

vector<vector<int>> adj;

1nt n; /⁄ lưu đỉnh

Graph(mt n) {

this->n =n;

adj.resize(n + 1);

Trang 5

Trang 9

}

void addEdge(int u, int v) {

adj[u].push_back(v);

adj[v].push_back(u);

}

}

// Ham duyét dé thi theo chiéu rong (BFS)

void BFS(Graph& g, int x) {

// Khai bao hang doi

queue<int> q;

// Đánh dấu đỉnh xuất phát đã được duyệt

vector<bool> visited(g.n + 1, false);

visited[x] = true;

// Thêm đỉnh xuất phát vào hàng đợi

q.push(x);

/ Duyệt cho đến khi hàng đợi rỗng

while (!g.empty()) {

// Lay đỉnh đâu tiên ra khỏi hàng đợi

int u = q.front();

q.popQ:

//Inra dinh u

cout <<u <<" ":

// Duyệt qua các đỉnh kề với u

for (int v : g.adj[u]) {

// Néu đỉnh v chưa được duyệt và v hợp lệ

if (!visited[v] && v <=g.n) {

// Đánh dấu đỉnh v đã được duyệt

visited[v] = true;

// Thém dinh v vao hang doi

q.push(v); }

}

}

}

int main() {

// Nhap sỐ lượng đỉnh và cạnh

int n, m;

cout << "nhap số lượng đỉnh và cạnh: ":

cin >> n >> m;

/ Tạo đồ thị Graph g(n);

cout << "nhap cac canh: "; // Nhap các cạnh

for (int 1 = 0; 1< my; i++)

Trang 6

Trang 10

t

int u, V;

cin >> tl >> V;

g.addEdge(u, v);

}

/⁄/ Nhập đỉnh xuất phat int x;

cout << "nhập đỉnh xuat phat: ";

cin >> x;

Trang 7

Trang 11

2.2 Soucre code của duyệt đồ thị theo chiều rộng sử dụng danh sách kề

#include <1ostream>

#include <vector>

#include <queue>

using namespace std;

// Khai bao cau tric dé thi

struct Graph{

vector<vector<int>> adj;

1nt n; /⁄ lưu đỉnh

Graph(mt n) {

this->n =n;

adj.resize(n + 1);

void addEdge(int u, int v) {

adj[u].push_back(v);

adj[v].push_back(u);

}

b

// Ham duyét dé thi theo chiéu rong (BFS)

void BFS(Graph& g, int x) {

// Khai bao hang doi

queue<int> q;

// Danh dau dinh xuat phat di duge duyét

vector<bool> visited(g.n + 1, false);

visited[x] = true;

// Thêm đỉnh xuất phát vào hàng đợi

q.push(x);

/ Duyệt cho đến khi hàng đợi rỗng

while (!q.empty()) {

// Lay dinh đầu tiên ra khỏi hàng đợi

int u = q.front();

q.popQ:

//Inra dinh u

cout <<u <<" ":

// Duyệt qua các đỉnh kề với u

for (int v : g.adj[u]) {

// Néu đỉnh v chưa được duyệt và v hợp lệ

if (!visited[v] && v <=g.n) {

// Đánh dấu đỉnh v đã được duyệt

Trang §

Trang 12

visited[v] = true;

// Thém dinh v vao hang doi

q.push(v);

}

}

}

}

int main() {

// Nhap số lượng đỉnh và cạnh

int n, m;

cout << "nhap số lượng đỉnh và cạnh: ":

cin >> n >> m;

/ Tạo đồ thị

Graph g(n);

cout << "nhập các cạnh: ":

/⁄/ Nhập các cạnh

for (int 1 = 0;1<m; 1+) {

int u, V;

cin >> u>>v;

g.addEdge(u, v):; }

// Nhap dinh xuat phat

int x;

cout << "nhap dinh xuat phat: ";

cin >> x;

// Duyét dé thi theo chiéu rộng từ đỉnh x

BFS(g, x);

return 0;

b

-Giai thich:

o n:Số lượng đỉnh của dé thi

đỉnh x

® - Thuật toán hoạt động như sau:

o_ Đánh dấu đỉnh x đã được duyệt và thêm nó vào hàng đợi

©_ Lặp lại cho đến khi hàng đợi rỗng:

“ Lấy đỉnh đầu tiên u ra khỏi hàng đợi

Trang 9

Trang 13

“ Duyệt qua các đỉnh kề v với u

dấu v đã được duyệt

o Nhap số lượng đỉnh và cạnh của dé thi

©_ Nhập thông tin các cạnh của dé thi

o_ Nhập đỉnh xuất phát

2.3 Kết quả

nhap dinh xuat phat 1

1324

D:\C C++\do_an_nhom_5\x64\Debug\baitapthu3.exe (process 14936) exited with code 9

TAI LIEU THAM KHAO https://vi.wikipedia.org/wiki/T%C3%ACm_ki%oE1%BA%BFm_theo_chi

*WEI“*BB%81u_r%E1%BB%99ng

https://gemini.google.com/app

https://vnoi.info/wiki/algo/graph-theory/breadth-first-search.md

https://www.guru99.com/vi/breadth-first-search-bfs-graph-example.html

Trang 10

Ngày đăng: 09/01/2025, 16:09

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN