Thầy đã đưa ra những gợi ý và hướng dẫn quý báu để giúp chúng em hiểu được những vấn đề phức tạp liên quan đến đồ án bên cạnh việc trình bày một cách hiệu quả.. Đặc tả Định nghĩa Trong t
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TPHCM
KHOA ĐÀO TẠO CHẤT LƯỢNG CAO
ĐỒ ÁN CÔNG NGHỆ THÔNG TIN
Trang 22
Tổng quan
Chúng em muốn gửi lời cảm ơn chân thành đến thầy Nguyễn Quang Ngọc, người phụ trách
dự án, đã hướng dẫn chúng em thực hiện đồ án Thầy đã đưa ra những gợi ý và hướng dẫn quý báu để giúp chúng em hiểu được những vấn đề phức tạp liên quan đến đồ án bên cạnh việc trình bày một cách hiệu quả Đồ án của chúng em đã hoàn thành nhờ sự hướng dẫn của thầy
Đồ án này được thực hiện trong vòng mười bốn tuần, vừa đủ để hoàn thành nó Tuy nhiên,
do thời gian chúng em thực hiện mỗi tuần không tối ưu nên đồ án sẽ mắc nhiều sai sót là điều khó tránh khỏi Chúng em rất mong nhận được mọi ý kiến đóng góp của thầy để giúp kiến thức còn hạn chế của chúng em được tốt hơn
Chúng em xin cảm ơn
Trang 33
Trang 44
Mục l c ụ
Tổng quan
Mục lục bảng
I Đặc tả
Định nghĩa
II Phân chia công việc
III Thiết kế
1 Biểu diễn đồ thị
2 Một ứng dụng của đồ thị 1
IV Tổng kết
1 Sinh viên tự đánh giá 2
2 Khó khan
3 Ưu điểm
4 Hạn chế
5 Ý tưởng phát triển 2
Trang 55
Mục lục bảng
Bảng phân chia công việc
Trang 6Đồ thị G là một bộ (V, E), với V là tập khác ∅, hữu hạn các phần tử được gọi là các đỉnh, E là tập các phần tử được gọi là các cạnh Mỗi phần tử e E liên kết với duy nhất ∈
một cặp đỉnh v, w V và được ký hiệu e = (v,∈ w), v, w ∈ V
e = (v, w) được gọi là cạnh kề của hai đỉnh v và w v và w là các đỉnh kề nhau (v kề với w) e1 = (v, w) và e2 = (v, w), e1 và e2 được gọi là 2 cạnh song song -
e = (v, v) được gọi là một khuyên hay vòng
d(v), gọi là bậc của đỉnh v, là số cạnh kề với v Nếu đỉnh v có vòng thì vòng được tính
là 2
Đỉnh có bậc bằng 0 được gọi là đỉnh cô lập
Đỉnh có bậc bằng 1 được gọi là đỉnh treo
Trang 77
II Phân chia công việc
Thứ tự Tên sinh viên Công việc Đóng góp
1 Lê Việt Khánh Tạo một đồ thị 100%
2 Nguyễn Huy Thêm một đỉnh vào
5 Lê Việt Khánh Xuất ma trận kề 100%
6 Nguyễn Huy Duyệt đồ thị theo
10 Nguyễn Huy Tạo mê cung 100%
11 Lê Việt Khánh Tìm đường ra khỏi
Trang 88
III Thiết kế
1 Biểu diễn đồ thị
Các thư viện:
<unordered_map>: Được sử dụng để lưu trữ thông tin về các đỉnh (vertices) của đồ thị
và thông tin về các cạnh thông qua cấu trúc dữ liệu không có thứ tự (unordered_map) <queue>: Được sử dụng để triển khai thuật toán duyệt đồ thị theo chiều rộng (BFS) Queue được sử dụng để duyệt qua các đỉnh theo thứ tự FIFO
<stack>: Được sử dụng để triển khai thuật toán duyệt đồ thị theo chiều sâu (DFS) Stack được sử dụng để duyệt qua các đỉnh theo thứ tự LIFO
<limits>: Sử dụng để đặt giá trị vô cùng (infinity) cho việc tính toán đường đi ngắn nhất trong thuật toán Dijkstra
<string>: Sử dụng để biểu diễn dữ liệu của đỉnh (vertex) trong đồ thị
<cstdlib> và <ctime>: Sử dụng để tạo số ngẫu nhiên khi tạo mê cung trong hàm createMaze Hàm rand() được sử dụng để sinh số ngẫu nhiên, và srand() được sử dụng
để khởi tạo seed cho generator số ngẫu nhiên
Trang 9unordered_map<int, Vertex<T>> vertices;
unordered_map<int, unordered_map<int, int>> adjacencyMatrix; // Su dung ma tran ke
Thêm một đỉnh vào đồ thị đã có
public:
// Them dinh vào do thi
void addVertex(int id, T data) {
Trang 10Xuất các tên đỉnh, tên cạnh
// Xuat danh sach dinh
void displayVertices() {
cout << "Ten dinh:" << endl;
for (const auto& vertex : vertices) {
cout << "Dinh " << vertex.first << ": " << vertex.second.data << endl; }
}
Trang 1111
Xuất ma trận kề
void displayAdjacencyMatrix() {
cout << "Ma tran ke:" << endl;
for (const auto& row : adjacencyMatrix) {
cout << "Tu dinh " << row.first << ": ";
for (const auto& neighbor : row.second) {
cout << neighbor.first << "(" << neighbor.second << ") ";
}
cout << endl;
}
}
Trang 1212
Duyệt đồ thị theo chiều rộng:
void BFS(int start) {
unordered_map<int, bool> visited;
Trang 1313
void DFS(int start) {
unordered_map<int, bool> visited;
for (const auto& neighbor : adjacencyMatrix[current]) {
int vertex = neighbor.first;
Trang 1414
Đường đi ngắn nhất từ đỉnh v đến đỉnh w, sử dụng thuật toán Dijkstra
void Dijkstra(int v, int w) {
unordered_map<int, int> distance;
priority_queue<pair<int, int>, deque<pair<int, int>>, greater<pair<int, int>>> pq;
for (const auto& vertex : vertices) {
for (const auto& neighbor : adjacencyMatrix[u]) {
int vertex = neighbor.first;
int weight = neighbor.second;
if (distance[vertex] > distance[u] + weight) {
distance[vertex] = distance[u] + weight;
Trang 15bool hasEdge(int v, int w) {
return adjacencyMatrix[v].find(w) != adjacencyMatrix[v].end();
}
Trang 1616
2 Một ứng dụng của đồ thị
Tạo mê cung
void createMaze(int start) {
unordered_map<int, bool> visited;
unordered_map<int, bool> unvisitedNeighbors;
for (const auto& neighbor : adjacencyMatrix[current]) {
Trang 17cout << "Me cung duoc tao tu dinh " << start << ":" << endl;
for (int i = 0; i < index; ++i) {
cout << visitedVertices[i] << " ";
}
cout << endl;
}
Trang 1818
Tìm đường ra khỏi mê cung
// Tim duong ra khoi me cung tu v den w
void findExitFromMaze(int v, int w) {
unordered_map<int, bool> visited;
cout << "Duong di tu dinh " << v << " den dinh " << w << ":" << endl;
for (int i = 0; i < index; ++i) {
Trang 1919
}
}
if (stack.empty() && path[index - 1] != w) {
// Quay lai neu không tim thay neighbor va duong di chua tim duoc
Trang 2020
IV Tổng kết
1 Sinh viên tự đánh giá
Hoàn thành các yêu cầu cơ bản
Code tưởng đối sạch
GUI vẫn còn quá đơn giản
Cần bổ sung thêm nhiều chức năng
5 Ý tưởng phát triển
Thêm các giao diện cho chương trìn
Trang 2121
Trang 2222
Trang 2323
Trang 2424
Trang 2525
Trang 2626
Trang 2727
Trang 2828
Trang 2929
Trang 3030
Trang 3131
Trang 3232
Trang 3333