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 3MỤ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 4MỞ ĐẦ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 5Chươ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 6Chươ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 10t
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 112.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 12visited[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