BÀI TẬP LỚN
Môn học/Mô đun:………………….
GHI TÊN BÀI TẬP Ở ĐÂY
Ngành: Công nghệ thông tin
SINH VIÊN THỰC HIỆN: Nguyễn Văn A
MÃ SỐ SINH VIÊN: 123456789
LỚP:
GV HƯỚNG DẪN:
1
BÀI TẬP LỚN
Môn học/Mô đun: Thiết kế đồ họa & Quảng cáo
GHI TÊN BÀI TẬP Ở ĐÂY
Ngành: Công nghệ thông tin
SINH VIÊN THỰC HIỆN: Nguyễn Văn A
MÃ SỐ SINH VIÊN: 123456789
LỚP: …
GV HƯỚNG DẪN: Tên GV
2
NHẬN XÉT
Nhận xét của giảng viên hướng dẫn:
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
……………………………………………………………………………………….....
GIẢNG VIÊN HƯỚNG DẪN
Th.S
3
LỜI CAM ĐOAN
Em xin cam đoan kết quả đạt được trong đề tài … là sản phẩm của em thực
hiện, không sao chép của người khác.
Những tài liệu, thông tin, hình ảnh tham khảo đều được trích dẫn rõ ràng, đúng
pháp luật.
Em xin chịu mọi trách nhiệm trước pháp luật đối với lời cam đoan của mình.
4
LỜI CẢM ƠN
Gợi ý:
Trong quá trình tìm hiểu, thực hiện …, khơng thể tránh khỏi những thiếu sót.
Rất mong nhận được sự góp ý từ thầy để bản thân hiểu rõ hơn về kiến thức liên quan
đến môn học, cũng như có được nhiều kinh nghiệm hơn để thực hiện các đề tài, dự án
tiếp theo.
Trân trọng cảm ơn!
(tùy theo khả năng của mỗi nhóm/SV, có thể viết theo ý riêng của mình)
Để có thể hồn thành bài tập lớn này, em xin gửi lời cảm ơn tới Khoa Công
nghệ thông tin - Trường Cao đẳng Công nghệ Bách Khoa Hà Nội đã tạo điều kiện
thuận lợi cho em trong q trình thực hiện.
Chân thành cảm ơn thầy (cơ) … đã tận tình giảng dạy, hướng dẫn, giải đáp
những thắc mắc trong suốt quá trình học tập và thực hiện đề tài.
hướng dẫn, chỉ bảo em trong suốt thời gian thực hiện bài
J nã cũng xin chân thành cảm ơn tất cả các Thây, các Cô trong Trường để giúp
em thực hiện được bài tập lớn này.
Mặc dù em đã có cố gắng, nhưng với trình độ cịn hạn ché, trong q trình thực
hiện đề ti khơng tránh khỏi những thiếu sót. Em hi vọng sẽ nhận được những ý
kiến nhận
xét, góp ý của các Thây giáo, Cơ giáo về những kết quả triển khai trong bài tập
lớn.
Em xin trân trọng cảm ơn!
5
MỤC LỤC
Contents
6
PHẦN 1 MỞ ĐẦU
LỜI NÓI ĐẦU
PHẦN 2 LÝ THUYẾT
1 Cây khung nhỏ nhất là gì
Định nghĩa
Theo lý thuyết đồ thị, chúng ta đều biết rằng 1 đồ thị được biểu diễn bằng cơng
thức G=(V,E)G=(V,E), trong đó đồ thị GG của chúng ta bao gồm tập các đỉnh VV và
tập các cạnh EE.
•
Cây khung (spanning tree) của đồ thị là một tập hợp các cạnh của đồ thị thỏa
mãn tập cạnh này khơng chứa chu trình và liên thơng (từ một đỉnh bất kì có
thể đi tới bất kỳ đỉnh nào khác theo mà chỉ dùng các cạnh trên cây khung)
•
Trong đồ thị có trọng số, cây khung nhỏ nhất (minimum spanning tree) là cây
khung có tổng trọng số các cạnh trong cây nhỏ nhất.
•
Một ví dụ về cây khung trong đồ thị vô hướng không trọng số:
7
•
Một ví dụ về cây khung nhỏ nhất trong đồ thị vơ hướng có trọng
số:
Trong khn khổ bài viết, chúng ta sẽ làm việc với đồ thị vơ hướng có trọng số.
Tính chất
Một vài tính chất của cây khung nhỏ nhất trong đồ thị vơ hướng có trọng số:
•
1. Tính chất chu trình: Trong một chu trình CC bất kỳ, nếu ee là cạnh có trọng
số lớn nhất tuyệt đối (khơng có cạnh nào có trọng số bằng ee) thì ee không thể
nằm trên bất kỳ cây khung nhỏ nhất nào.
•
2. Đường đi hẹp nhất: Xét 2 đỉnh uu, vv bất kỳ trong đồ thị. Nếu ww là trọng
số của cạnh lớn nhất trên đường đi từ uu đến vv trên cây khung nhỏ nhất của
đồ thị thì ta khơng thể tìm được đường đi nào từ uu đến vv trên đồ thị ban đầu
chỉ đi qua những cạnh có trọng số nhỏ hơn ww.
•
3. Tính duy nhất: Nếu tất cả các cạnh đều có trọng số khác nhau thì chỉ có duy
một cây khung nhỏ nhất. Ngược lại, nếu một vài cạnh có trọng số giống nhau
thì có thể có nhiều hơn một cây khung nhỏ nhất.
•
4. Tính chất cạnh nhỏ nhất: Nếu ee là cạnh có trọng số nhỏ nhất của đồ thị, và
khơng có cạnh nào có trọng số bằng ee thì ee nằm trong mọi cây khung nhỏ
nhất của đồ thị.
Chứng minh
Lưu ý : các bạn mới học cây khung lần đầu cân nhắc việc đọc chứng minh, tác giả
khuyên các bạn nên tạm thời bỏ qua phần này
Xuyên suốt cả bốn tính chất, ta đều sử dụng phép phản chứng để chứng minh
8
•
•
•
•
1. Tính chất chu trình: Giả sử ee thuộc một cây khung TT của đồ thị, ta sẽ
chứng minh luôn tồn tại một cây khung khác của đồ thị có trọng số nhỏ
hơn TT.
o Ta thử xóa cạnh ee khỏi cây khung TT. Lúc này, TT sẽ bị chia làm 2
thành phần liên thông và tổng trọng số giảm đi wewe.
o Xét các đỉnh nằm trong chu trình CC, giả sử sau khi xóa ee khỏi cây
khung, các đỉnh này vẫn liên thơng với nhau. Vì thế, khi thêm ee trở lại
vào cây khung, ee sẽ kết nối 2 đỉnh đã liên thơng với nhau ⇒⇒ tồn tại
chu trình trong cây khung ⇒⇒ Trái với giả thiết TT là cây khung. ⇒ Vậy
nên, khi xóa ee khỏi TT, các đỉnh nằm trong chu trình CC sẽ bị tách làm
2 thành phần liên thơng. Do đó, ta có thể chọn ra cạnh e′e′ khác ee thuộc
chu trình CC để kết nối 2 thành liên thông này, biến TT trở lại thành một
cây khung của đồ thị. Mặt khác, ee là cạnh có trọng số lớn nhất tuyệt đối
trên CC, nên khi thay ee bằng e′e′, trọng số của T sẽ giảm đi we−we
′we−we′ Kết luận: T không phải là cây khung nhỏ nhất của đồ thị.
2. Đường đi hẹp nhất:
o Xét cây khung nhỏ nhất TT bất kỳ của đồ thị GG mà tồn tại đường
đi u→vu→v trên GG có cạnh lớn nhất nhỏ hơn cạnh lớn nhất của đường
đi u→vu→v trên TT.
o Gọi đường đi u→vu→v trên GG là pathpath, cạnh lớn nhất của đường
đi u→vu→v trên TT là ee. ⇒ Như vậy, nếu xóa ee khỏi cây khung ban
đầu, cây khung sẽ bị chia thành 2 TPLT rời nhau, một TPLT chứa uu và
TPLT còn lại chứa vv.
o Do pathpath là đường đi u→vu→v trên GG nên trên pathpath sẽ tồn tại
cạnh e′e′ có thể kết nối 2 TPLT này. Mà mọi cạnh trên pathpath đều có
trọng số nhỏ hơn ee (như giả thiết) ⇒ Khi xoá ee và thay bằng e′e′, ta sẽ
thu được 1 cây khung T′T′ có trọng số nhỏ hơn cây khung ban đầu Kết
luận: TT không phải cây khung nhỏ nhất của đồ thị.
3. Tính duy nhất:
o Giả sử tồn tại 2 cây khung nhỏ nhất TT và T′T′. Xét cạnh u−vu−v nằm
trong TT nhưng không trong T′T′.
o Gọi đường đi u→vu→v trên TT là pathpath, trên T′T′ là path′path′. Hiển
nhiên, path′path′ không chứa cạnh u−vu−v.
o Vì trọng số các cạnh của đồ thị đều khác nhau ⇒⇒ Cạnh lớn nhất
của pathpath sẽ có trọng số lớn hơn trọng số cạnh lớn nhất của path′path
′ hoặc ngược lại. ⇒ Theo tính chất đường đi hẹp nhất, TT hoặc T′T′ sẽ
không phải là cây khung nhỏ nhất.
4. Tính chất cạnh nhỏ nhất:
Ta sẽ chứng minh mọi cây khung không chứa ee của đồ thị đều không phải là
cây khung nhỏ nhất.
o
o
Giả sử ee nối 2 đỉnh uu, vv của đồ thị. Gọi TT là 1 cây khung không
chứa ee của đồ thị.
Xét cạnh e′e′ bất kỳ thuộc đường đi từ u→vu→v trên TT. Khi xóa e′e
′ khỏi TT, TT sẽ bị tách làm 2 thành phần liên thông, 1 thành phần liên
thông chứa uu, 1 phần phần liên thơng chứa vv. ⇒ Do đó, ta hoàn toàn
9
o
có thể thêm cạnh ee (nối 2 đỉnh u−vu−v) vào TT để kết nối 2 thành phần
liên thông này, khi đó TT sẽ trở lại thành 1 cây khung của đồ thị.
Mặt khác, ee là cạnh có trọng số nhỏ nhất tuyệt đối của đồ thị, nên khi
thay e′e′ bằng ee trên cây khung TT, trọng số của TT sẽ giảm đi 1 lượng
dương Kết luận: TT ban đầu không phải là cây khung nhỏ nhất của đồ
thị.
2 Thuật toán tìm cây khung nhỏ nhất
Thuật tốn Kruskal
Ý tưởng thuật tốn: Ban đầu mỗi đỉnh là một cây riêng biệt, ta tìm cây khung nhỏ
nhất bằng cách duyệt các cạnh theo trọng số từ nhỏ đến lớn, rồi hợp nhất các cây lại
với nhau.
Cụ thể hơn, giả sử cạnh đang xét nối 2 đỉnh uu và vv, nếu 2 đỉnh này nằm ở 2 cây
khác nhau thì ta thêm cạnh này vào cây khung, đồng thời hợp nhất 2 cây
chứa uu và vv.
Giả sử ta cần tìm cây khung nhỏ nhất của đồ thị GG. Thuật tốn bao gồm các bước
sau:
•
•
•
Khởi tạo rừng FF (tập hợp các cây), trong đó mỗi đỉnh của G tạo thành một cây
riêng biệt.
Khởi tạo tập SS chứa tất cả các cạnh của GG.
Chừng nào SS cịn khác rỗng và FF gồm hơn một cây
o Xóa cạnh nhỏ nhất trong SS
o Nếu cạnh đó nối hai cây khác nhau trong FF, thì thêm nó vào FF và hợp
hai cây kề với nó làm một
o Nếu khơng thì loại bỏ cạnh đó.
Khi thuật tốn kết thúc, rừng chỉ gồm đúng một cây và đó là một cây khung nhỏ nhất
của đồ thị GG
Ví dụ các bước giải bài tốn tìm cây khung nhỏ nhất với thuật tốn
Kruskal
10
:
Để thực hiện thao tác kiểm tra cạnh và hợp nhất 2 cây một cách nhanh chóng, ta sử
dụng cấu trúc Disjoint Set, dưới đây là đoạn code dùng để cài đặt thuật toán:
/*input
44
121
232
343
414
*/
#include <bits/stdc++.h>
using namespace std;
// Cấu trúc để lưu các cạnh đồ thị
// u, v là 2 đỉnh, c là trọng số cạnh
struct Edge {
int u, v, c;
Edge(int _u, int _v, int _c): u(_u), v(_v), c(_c) {};
};
struct Dsu {
vector<int> par;
void init(int n) {
par.resize(n + 5, 0);
for (int i = 1; i <= n; i++) par[i] = i;
}
int find(int u) {
11
if (par[u] == u) return u;
return par[u] = find(par[u]);
}
bool join(int u, int v) {
u = find(u); v = find(v);
if (u == v) return false;
par[v] = u;
return true;
}
} dsu;
// n và m là số đỉnh và số cạnh
// totalWeight là tổng trọng số các cạnh trong cây khung nhỏ nhất
int n, m, totalWeight = 0;
vector < Edge > edges;
int main() {
// Fast IO
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v, c;
cin >> u >> v >> c;
edges.push_back({u, v, c});
}
dsu.init(n);
// Sắp xếp lại các cạnh theo trọng số tăng dần
sort(edges.begin(), edges.end(), [](Edge & x, Edge & y) {
return x.c < y.c;
});
// Duyệt qua các cạnh theo thứ tự đã sắp xếp
for (auto e : edges) {
// Nếu không hợp nhất được 2 đỉnh u và v thì bỏ qua
if (!dsu.join(e.u, e.v)) continue;
// Nếu hợp nhất được u, v ta thêm trọng số cạnh vào kết quả
totalWeight += e.c;
}
// Xuất ra kết quả
cout << totalWeight << '\n';
12
}
Chứng minh tính đúng đắn của thuật tốn:
Ta phải chứng minh hai điều:
1.
2.
đầu ra của thuật toán là một cây khung
cây đó có trọng số nhỏ nhất trong số tất cả các cây khung của đồ thị.
Chứng minh (1)
•
•
Mỗi cạnh (u,v)(u,v) được xét đến, nó chỉ kết nạp vào câu khung
nếu u,vu,v thuộc 2 thành phần liên thông khác nhau Tu,TvTu,Tv ⇒ Do đó các
cạnh được thêm khơng tạo thành chu trình
Do TT khơng có chu trình ⇒ số cạnh được thêm ≤n−1≤n−1. Ta sẽ chứng
minh TT có đúng n−1n−1 cạnh
o Giả sử số cạnh được thêm
phần liên thông
o Mặt khác, do GG liên thông ⇒ tồn tại các cạnh thuộc GG nối các thành
phần liên thơng đó mà khơng thuộc TT. Do đó cạnh đầu tiên nhỏ nhất
trong số các cạnh này sẽ được đưa vào do nó khơng tạo thành chu trình,
mâu thuẫn với giả thiết ở trên ⇒ Giả sử sai
o Vậy số cạnh được thêm vào bằng đúng n−1n−1
Chứng minh (2)
Lưu ý : Nếu bạn mới học cây khung lần đầu tiên chưa nên đọc ngay chứng minh này,
vì chúng có thể khiến bạn hoang mang. Chứng minh có sử dụng một số khái niệm
như lát cắt, lát cắt hẹp nhất
Trong chứng minh này, mình có quy ước sử dụng một số kí hiệu:
•
•
|A||A| : số lượng phần tử có trong tập hợp AA
A−BA−B : tập hợp các phần tử thuộc AA mà không thuộc BB
Giờ cùng đi vào chi tiết chứng minh nhé (づ◔ ͜ʖ◔)づ
•
•
•
Gọi TT là cây khung đầu ra của thuật toán Kruskal và T∗T∗ là một cây khung
nhỏ nhất, ta sẽ chứng minh tổng trọng số trên TT và T∗T∗ bằng
nhau : c(T)c(T) = c(T∗)c(T∗)
Nếu c(T)c(T) = c(T∗)c(T∗) ⇒ hiển nhiên đúng
Nếu c(T)c(T) ≠ c(T∗)c(T∗) gọi (u,v)(u,v) là
cạnh ∈∈ TT mà ∉∉ T∗T∗ hay thuộc T−T∗T−T∗. Gọi SS là thành phần
liên thông chứa u tại thời điểm (u,v)(u,v) được thêm vào TT. Nhận xét: Dễ
thấy nếu xóa cạnh (u,v)(u,v) trên TT thì sẽ tách thành 2 thành phần liên
thông SS và G−SG−S. Đây là một lát cắt, ta có thể thêm bất cứ cạnh nào nối
giữa 2 thành phần liên thông này để tạo thành một cây mới ⇒ (u,v)
(u,v) ∈∈ lát cắt (S,G−S)(S,G−S).
13
Định nghĩa : Một lát cắt ss - tt là một tập con của づ mà khi loại bỏ những cạnh
này thì khơng cịn đường đi từ ss tới tt. (Bài toán lát cắt hẹp nhất)
Ta sẽ chứng minh (u,v)(u,v) thuộc lát cắt nhỏ nhất (S,G−S)(S,G−S)
o
o
o
o
Nếu tồn tại đường đi trọng số ee từ SS đến G−SG−S có trọng số nhỏ
hơn (u,v)(u,v), thuật tốn kruskal sẽ chọn ee thay vì (u,v)(u,v) ⇒ vơ lý.
⇒ Ta khẳng định (u,v)(u,v) có trọng số nhỏ nhất trong các cạnh
từ SS đến (G−S)(G−S). (1)
Mặt khác, bởi vì T∗T∗ là 1 cây khung nhỏ nhất nên có một đường
từ SS tới G−SG−S, gọi cạnh thuộc đường này là (x,y)(x,y). Xét cây
khung : T∗′=T∗∪(u,v)−(x,y)T∗′=T∗∪(u,v)−(x,y) ⇒ c(T∗′)=c(T∗)
+c(u,v)−c(x,y)c(T∗′)=c(T∗)+c(u,v)−c(x,y)
Do theo (1) có: c(u,v)≤c(x,y)c(u,v)≤c(x,y) nên c(T∗′)≤c(T∗)c(T∗
′)≤c(T∗) mà T∗T∗ là cây khung nhỏ nhất ⇒ c(T∗′)c(T∗
′) = c(T∗)c(T∗) và T∗′T∗′ cũng là cây khung nhỏ nhất ⇒ |T−T∗′||
T−T∗′| = |T−T∗|−1|T−T∗|−1 Ý nghĩa : Như vậy ta đã biến đổi
được cây khung nhỏ nhất T∗T∗ thành cây khung T∗′T∗′ cũng là cây
khung nhỏ nhất mà làm giảm số cạnh khác nhau của TT và T∗T∗ đi 1
cạnh
Lặp lại cách chứng minh với mỗi cạnh thuộc T−T∗′T−T∗′, ta sẽ biến
đổi được T∗′T∗′ thành TT, hay nói cách khác đã đã biến đổi cây khung
nhỏ nhất ban đầu về cây khung đầu ra của
Kruskal : c(T)=c(T∗)c(T)=c(T∗).
Đánh giá độ phức tạp thuật toán: Gọi nn là số đỉnh, mm là số cạnh của đồ thị
Thuật tốn gồm 2 phần:
•
•
Sắp xếp mảng mm cạnh theo trọng số tăng dần mất độ phức
tạp O(mlogm)O(mlogm).
Ta duyệt mm cạnh, mỗi cạnh dùng Disjoint Set mất độ phức
tạp O(logn)O(logn), vậy tổng cộng mất độ phức tạp O(mlogn)O(mlogn).
⇒⇒ độ phức tạp của thuật tốn Kruskal là O(mlogm+mlogn)
PHẦN 3 BÀI TỐN
I Tìm hiểu bài tốn
Tìm cây khung nhỏ nhất của các đồ thị sau theo thuật toán Kruskal
14
II Giải Bài Toán
Điểm đầu
A
Điểm cuối
C
Trọng số
4
A
A
B
E
B
E
10
42
14
B
C
F
D
3
3
C
D
D
D
E
F
G
E
H
G
F
H
15
1
20
5
11
9
15
G
H
7
D-E-1 Ta nhận thấy cạnh D-E không tạo ra một chu trình nào. Vì vậy, thêm D-E vào
tập hợp
C-D-3 Ta nhận thấy cạnh C-D khơng tạo ra một chu trình nào. Vì vậy, thêm C-D vào
tập hợp
B-F-3 Ta nhận thấy cạnh B-F khơng tạo ra một chu trình nào. Vì vậy, thêm B-F vào
tập hợp
A-C-4 Ta nhận thấy cạnh A-C khơng tạo ra một chu trình nào. Vì vậy, thêm A-C vào
tập hợp
D-G-5 Ta nhận thấy cạnh D-G không tạo ra một chu trình nào. Vì vậy, thêm D-G vào
tập hợp
G-H-7 Ta nhận thấy cạnh G-H không tạo ra một chu trình nào. Vì vậy, thêm G-H vào
tập hợp
E-F-11 Ta nhận thấy cạnh E-F khơng tạo ra một chu trình nào. Vì vậy, thêm E-F vào
tập hợp
Cịn các điểm khác tạo ra một chu trình nên ta khơng thêm vào tập hợp !
Kết luận ta có cây khung như sau:
a
b
4
3
1
c
d
e
f
3
11
5
g
7
h
16
LỜI KẾT
Lời kết không dài quá 300 từ.
Cần tổng hợp được các ý chính về nội dung;
Nêu được tầm quan trọng của những thiết kế mình đã thực hiện;
Thơng qua bài tập, mình rút ra những bài học kinh nghiệm gì?
17
TÀI LIỆU THAM KHẢO
A. Sách tham khảo
Ghi số thứ tự từ 1 đến hết. Tên tác giả (ghi thứ tự ABC), năm xuất bản (để
trong ngoặc đơn), Tên sách (in nghiêng), Tên nhà xuất bản.
1. Nguyễn Văn A (2222), Giáo trình Thiết kế đồ họa, Nxb Hoa Thánh.
2. Nguyễn Ngọc Bảo (1995), Phát triển tính tích cực, tính tự lực của người học trong
quá trình dạy học, Nxb Giáo dục, Hà Nội.
3. Ngơ Bá Cơng (2008), Giáo trình Mĩ thuật cơ bản, Nxb Đại học Sư phạm, Hà Nội.
4. ……..
B. Hình ảnh tham khảo/sử dụng trong thiết kế
1. Ảnh điện thoại trong Thiết kế 1: (02/6/2022)
2. Ảnh ô tô trong Thiết kế 2: (02/6/2022)
3. Ảnh cô gái trong Thiết kế 3: (02/6/2022)
4. Ảnh sinh viên trong Thiết kế 4: (02/6/2022)
5. ……
18