Thiết kế và phân tích thuật toán - Bài toán tô màu đồ thị
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÀI TẬP LỚN THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN
ĐỀ TÀI 15: BÀI TOÁN TÔ MẦU ĐỒ THỊ
Giáo viên hướng dẫn: PGS NGUYỄN ĐỨC NGHĨA
Sinh viên thực hiện :
Hà Nội, 12/2010
Trang 2M C L C ỤC LỤC ỤC LỤC
I GIỚI THIỆU BÀI TOÁN 3
1 Tổng quan về đồ thị 3
1.1 Đồ thị và các cách biểu diễn đồ thị 3
1.2 Các bài toán điển hình 5
2 Bài toán tô mầu đồ thị 5
2.1 Bài toán tô mầu cạnh 5
2.2 Bài toán tô mầu đỉnh 6
2.3 Các khái niệm liên quan 6
2.4 Ứng dụng 7
II GIẢI THUẬT 8
1 Bài toán tô mầu đỉnh 8
1.1 Các định nghĩa sử dụng: 8
1.2 Thuật toán 9
1.3 Ví dụ 11
2 Bài toán tô mầu cạnh 16
2.1 Giải thuật 16
2.3 Độ phức tạp: 25
III CÀI ĐẶT THUẬT TOÁN 25
1 Bài toán tô mầu đỉnh 26
2 Bài toán tô mầu cạnh 35
2.1 Đọc dữ liệu từ file 35
2.2 Dữ liệu vào từ bàn phím 47
3 Mã nguồn 61
IV TÀI LIỆU THAM KHẢO 61
PHỤ LỤC 1: DANH MỤC CÁC HÌNH ẢNH TRONG TÀI LIỆU 62
PHỤ LỤC 2: PHÂN CHIA CÔNG VIỆC 63
Trang 3I GIỚI THIỆU BÀI TOÁN
Đồ thị biểu diễn được rất nhiều cấu trúc, nhiều bài toán thực tế có thể được biểu diễn bằng đồ thị
Ví dụ, cấu trúc liên kết của một website có thể được biểu diễn bằng một đồ thị có hướng như
sau: các đỉnh là các trang web hiện có tại website, tồn tại một cạnh có hướng nối từ trang A tới trang B khi và chỉ khi A có chứa 1 liên kết tới B.
Cấu trúc đồ thị có thể được mở rộng bằng cách gán trọng số cho mỗi cạnh Có thể sử dụng đồ thị
có trọng số để biểu diễn nhiều khái niệm khác nhau Ví dụ, nếu đồ thị biểu diễn một mạng đườnggiao thông, các trọng số có thể là độ dài của mỗi con đường Một cách khác để mở rộng đồ thị cơ
bản là qui định hướng cho các cạnh của đồ thị (như đối với các trang web, A liên kết tới B, nhưng B không nhất thiết cũng liên kết tới A) Loại đồ thị này được gọi là đồ thị có hướng Một
đồ thị có hướng với các cạnh có trọng số được gọi là một lưới
Hình 01: Đồ thị vô hướng
Các cách biểu diễn đồ thị
- Ma trận kề (Adjaceny matrix) - một ma trận N × N, trong đó N là số đỉnh của đồ thị Nếu
0 Cấu trúc này tạo thuận lợi cho việc tìm các đồ thị con và để đảo các đồ thị
Trang 4Labeled graph Adjacency matrix
- Danh sách kề (Adjacency list) - Mỗi đỉnh của đồ thị có một danh sách các đỉnh kề nó
(nghĩa là có một cạnh nối từ đỉnh này đến mỗi đỉnh đó) Trong đồ thị vô hướng, cấu trúcnày có thể gây trùng lặp Chẳng hạn nếu đỉnh 3 nằm trong danh sách của đỉnh 2 thì đỉnh 2cũng phải có trong danh sách của đỉnh 3 Lập trình viên có thể chọn cách sử dụng phầnkhông gian thừa, hoặc có thể liệt kê các quan hệ kề cạnh chỉ một lần Biểu diễn dữ liệunày thuận lợi cho việc từ một đỉnh duy nhất tìm mọi đỉnh được nối với nó, do các đỉnhnày đã được liệt kê tường minh
The graph pictured above has thisadjacency list representation:
Trang 51.2 Các bài toán điển hình
2 Bài toán tô mầu đồ thị
Tô màu đồ thị và sự tổng quát của nó là công cụ hữu dụng trong việc mô hình hóa rất nhiều bàitoán khác nhau trong vấn đề xếp lịch, xây dựng chương trình và vấn đề phân công công việc Bàitoán tô màu đồ thị bao gồm nhiều loại: tô màu đỉnh đồ thị (vertex graph coloring) , tô màu cạnh
đồ thị (edge graph coloring)
2.1 Bài toán tô mầu cạnh
Bài toán
Cho G=(V,E) là đơn đồ thị vô hướng ( G không là đồ thị khuyên) , hãy tìm cách gán (tô màu)cho mỗi cạnh của đồ thị một màu sao cho hai cạnh có cùng chung 1 đỉnh không bị tô bởi cùngmột màu Một phép gán màu cho các cạnh như vậy gọi là một phép tô màu cạnh đồ thị Nói cáchkhác, phép tô cạnh đồ thị bởi k màu nói trên có thể được hiểu là một phân hoạch của tập cạnh Ecủa G thành k tập con (tương ứng với k màu) sao cho mỗi tập con ứng với một màu i nhất định.Bài toán đặt ra là tìm cách tô màu nào sử dụng số màu ít nhất có thể
Ví dụ
Đồ thị trong hình trên có thể tô bởi 4 màu Đồ thị G gọi là tô được bởi k màu-cạnh nếu G có mộtphép tô k màu-cạnh phù hợp.Thông thường hầu hết các đồ thị không là đồ thị khuyên đều tôđược.Và nếu G có tính chất như vậy thì G cũng có thể tô bởi l màu với l>k
Trang 62.2 Bài toán tô mầu đỉnh
Một phép tô mầu sử dụng nhiều nhất k mầu gọi là một phép tô k mầu Số lượng mầu nhỏ nhấtcần để tô các đỉnh của đồ thị G gọi là sắc số đỉnh của đồ thị G, sao cho không có hai đỉnh kềnhau nào được tô cùng mầu
Một đồ thị có thể tô được bằng k mầu, trong đó mỗi một tập các đỉnh cùng mầu gọi là một lớpmầu
Một đồ thị có thể được tô bằng k mầu nghĩa là có có k tập độc lập trong đồ thị
2.3 Các khái niệm liên quan
Định nghĩa 1:
Sắc số cạnh: của đồ thị không là đồ thị khuyên χ’(G): là số màu k nhỏ nhất dùng để tô tất cả các
cạnh của G sao cho không có 2 cạnh kề cùng màu.Khi đó χ’(G)=k.Theo đồ thị G hình 1.1 ta có
thể thấy không có cách nào phù hợp để tô G bởi 3 màu.Do đó G có sắc lớp=4.
Sanders & Zhao 2001)
Rõ ràng, trong tất cả các cách tô màu cạnh đồ thị thì những cạnh kề với cùng một đỉnh phải cómàu khác nhau.Khi đó nếu gọi ∆ là giá trị lớn nhất trong tập bậc của đỉnh v ( ∆=maxdeg(v) ) thìhiển nhiên:
Χ’(G) ≥ ∆
Từ nhận xét trên cộng với tính chất 3 của sắc số cạnh χ′(G) ta suy ra được nhận xét sau:
(
Δ(G)≤ χ′(G) ≤ Δ(G) + 1
Trang 7Công thức trên cũng là công thức biểu diễn của định lý Vizing mà chúng ta sẽ phát biểu dưới
đây.
Định lý Vizing :
Bất kì một đơn đồ thị G nào cũng có số : χ’(G) thỏa mãn χ’(G)=∆ hoặc χ’=∆+1
Chứng minh: Vì chúng ta chỉ quan tâm đến nội dung của các định lý, lấy cơ sở cho việc xây
dựng thuật toán giải quyết bài toán tô màu cạnh đồ thị Do đó trong báo cáo này, tất cả nhữngphần chứng minh các định lý các bổ để sẽ được trình bày ở phần phụ phía cuối báo cáo
Đến đây, chúng ta đã biết được sắc số cạnh của một đơn đồ thị biến thiên trong khoảng [Δ(Δ(G), Δ(G) +1] Bài toán tô màu cạnh đồ thị đặt ra yêu cầu phải xác định một cách tô màu với số màu
ít nhất có thể để tô màu tất cả các cạnh của đồ thị Vậy trong hệ bất đẳng thức (1) khi nào bấtđẳng thức bên trái xảy ra dấu bằng
các đợt thi, các đỉnh có cùng mầu sẽ thi cùng 1 đợt
Ví dụ:
Có 7 môn thi với thông tin như sau:
Hãy xếp lịch thi thành các đợt sao cho các sinh viên đều có thể dự thi tuần tự các môn mình đăng
ký
Trang 8Hình 02: Đồ thị G của bài toán lập lịch trên
- Bài toán phân phối các thanh ghi chỉ số (register allocation)
Trong lập trình các thanh ghi thường được dung để lưu trữ giá trị các biến tạm thời Bài toán yêucầu tìm số thanh ghi ít nhất cần sử dụng trong một chương trình
Giải pháp:
Biểu diễn bằng đồ thị với:
Số thanh ghi ít nhất cần sử dụng sẽ là số mầu của đồ thị trên
II GIẢI THUẬT
1 Bài toán tô mầu đỉnh
1.1 Các định nghĩa sử dụng:
Để mô tả giải thuật nhóm bắt đầu với việc diễn giải các thuật ngữ, định nghĩa mà giải thuật đềcập tới
- ⌊x ⌋: biểu thị các chức năng sàn tức là số nguyên lớn nhất không lớn hơn x
- ⌈ x⌉: biểu thị chức năng trần nghĩa là số nguyên bé nhất là không bé hơn x
cạnh E, sao cho mỗi cạnh là một cặp không có thứ tự của các đỉnh khác nhau Lưu ý rằng
định nghĩa của G rõ ràng cấm các vòng lặp(cạnh nối một đỉnh với chính nó) và các cạnh
đa (nhiều cạnh tham gia một cặp đỉnh), khi thiết lập E cũng phải được giới hạn Chúng tôi có
thể gán nhãn các đỉnh của G với 1 số nguyên, 2, , n.
Trang 9- Nếu các cặp không có thứ tự của các đỉnh {u, v} là một cạnh trong G, chúng ta nói u đó là một lân cận của v (hoặc u kề với v) và viết uv ∈ E Lân cận đối xứng rõ ràng là một mối quan hệ: uv ∈ E nếu và chỉ nếu vu ∈ E
- Bậc của một đỉnh v, ký hiệu là d (v), là số lân cận của v Số bậc tối đa của tất cả các đỉnh
của G được ký hiệu là Δ
- Các ma trận kề của G là một ma trận n × n với các mục trong hàng u và cột v bằng 1
nếu uv ∈ E và bằng 0 nếu ngược lại
(G) × V (H)với một cạnh đang kết nối đỉnh (u 1, v 1) với đỉnh (u 2, v 2) nếu và chỉ nếu hoặc
- Đồ thị đầy đủ với m đỉnh được ký hiệu là K m.
- Tập độc lập S của đồ thị G là một tập các đỉnh như vậy mà không chứa cặp không có thứ tự
của các đỉnh trong S là một cạnh Với một bộ độc lập S củaG và một đỉnh v bên ngoài S, chúng ta nói v là có thể thêm vào nếu đặt S∪ {v} vẫn là một tập độc lập của G Ký hiệu ρ (S) là số đỉnh có thể thêm vào của một tập độc lập S của G Một tập độc lập tối đa không có đỉnh có thể thêm vào Một tập độc lập tối đa là một tập độc lập với số lượng các
đỉnh lớn nhất Lưu ý rằng một tập độc lập tối đa luôn luôn là tối đa, nhưng không nhất thiếtphải ngược lại
màu duy nhất cho mỗi đỉnh của G sao cho không có hai đỉnh kề nhau có cùng màu Số màu χ(G) của đồ thị G là giá trị nhỏ nhất của m mà tồn tại tương ứng một một m-màu của các đỉnh củaG
- Thuật toán là một phương pháp giải quyết vấn đề thích hợp để thực hiện như một chương
trình máy tính Trong khi thiết kế thuật toán chúng ta thường phải đối mặt với một số phươngpháp tiếp cận khác nhau
- Thuật toán thời gian - đa thức A có số lượng các bước tính toán luôn luôn bị chặn bởi một
hàm đa thức của các kích thước của đầu vào Do đó, một thuật toán thời gian đa thức là mộtvấn đề thực sự hữu ích trong thực tế Các lớp của tất cả các vấn đề như vậy có thuật toán thời
gian đa thức được ký hiệu là P Đối với một số vấn đề, không có thuật toán thời gian đa thức
được biết đến, nhưng những vấn đề này có thuật toán thời gian đa thức bất định: hãy thử tất
cả các ứng viên cho các giải pháp cùng một lúc và cho mỗi ứng viên nhất định, xác minhxem đó là một giải pháp chính xác trong thời gian đa thức
1.2 Thuật toán
Nhóm bắt đầu với tích Đề Các cho phép chúng ta chuyển đổi các vấn đề của việc tìm kiếm một
tập m-màu của các đỉnh n của một đồ thị tương đương như việc tìm kiếm một bộ độc lập kích
Trang 10Giả sử có một tập m-màu của các đỉnh của G Xác định một tập con S của các đỉnh của tích đề
màu v đối với tập m màu thích hợp Vì mỗi đỉnh của G được giao một màu duy nhất, | S | = n Bây giờ chúng ta sẽ chỉ ra rằng S là một tập độc lập Cho (u 1, v 1) và (u 2, v 2) thuộc S, giả sử có
năng:
trong G đượcgiao một màu duy nhất Nhưng sau đó {v 1, v1} không thể là một cạnh
một tập m màu của G từ đỉnh kề phải được giao các màu khác nhau (mâu thuẫn).
Vì vậy không thể có một cạnh giữa hai đỉnh trong S và S phải là một tập độc lập
rằng G có m màu riêng biệt Nếu m lớn hơn hoặc bằng n thì G có thể được m màu một cách tầm thường , do đó giả sử m nhỏ hơn n Sự phân chia các đỉnh của S vào nhiều nhất là m lớp tương đương C 1, C 2 , , C m, nơi một đỉnh (u, v) trong S thuộc về lớp tương đương C i khi và chỉ
đưa ra một định nghĩa phân chia tốt của các đỉnh các đỉnh của G tuân theo:
Cho một đỉnh u của G, nếu u thuộc về cả hai C 'i và C' j thì (u, v i) thuộcC i và (u,
v j) thuộc C j. Khi K m đầy đủ, {v i, v k} là một cạnh trong K m, do đó, {(u, v i), (u, v j)} là một
vậy, các bộ C '1, C' 2 , , C 'm là cặp phân chia
j i phân biệt mọi đỉnh của G được chứa trong một số lớp tương đương 'C Do đó,
tập m-màu của các đỉnh của G
Trang 11Bây giờ chúng ta định nghĩa hai thủ tục để thực hiện với tập độc lập trong tích đề các G × K m.
- Thủ tục 1
lại, cho mỗi đỉnh có thể thêm (u, v) của S, tìm số ρ (S∪ {(u, v)}) của đỉnh có thể thêm của tập độc
nhất và chứa tập độc lập S ∪ {(u, v) max} Lặp lại cho đến khi tập độc lập không có đỉnh có thể
thêm vào
- Thủ tục 2
cho (u 1, v 1) có đúng một lân cận (u 2, v 2 ) trong S, đầu ra S.Ngược lại, tìm thấy một
Với đầu vào là một đơn đồ thị G với n đỉnh, tìm kiếm một tập m-màu của các đỉnh của G Để
kích thước n nhỏ nhất, thì đi đến phần III
Trang 12 Phần I Đối với i = 1, 2, , n và j = 1, 2, , n lần lượt
o Khởi tạo tập độc lập S i, j = {(u i, v j)}.
o Thực hiện thủ tục 3.1 trên S i, j.
o Đối với r = 1, 2, , n thực hiện thủ tục 3.2 lặp lại r lần.
o Kết quả là một tập độc lập tối đa S i, j.
Phần II Với mỗi cặp tập độc lập tối đa S i, j, S k, l tìm thấy trong phần I
o Khởi tạo S đặt độc lập i, j, k, l = S i, j ∩ S k, l.
o Thực hiện thủ tục 3,1 trên S i, j, k, l.
o Đối với r = 1, 2, , n thực hiện thủ tục 3,2 lần r lặp đi lặp lại.
o Kết quả là một tập độc lập tối đa S i, j, k, l.
Phần III Nếu một tập độc lập S với kích thước n đã được tìm thấy tại bất kỳ giai đoạn của phần I hoặc phần II, đầu ra S như là một tập m-màu của các đỉnh của G theo Bổ đề Đề các Ngược lại, kết luận thuật toán không thể tìm thấy bất kỳ tương ứng m-màu của các đỉnh của G.
1.3 Ví dụ
Chúng ta thể hiện các bước của thuật toán bằng một ví dụ nhỏ Đồ thị đầu vào được thể hiện
dưới đây trong hình 3.1 với n = 4 đỉnh có nhãn V = {1, 2, 3, 4} Các thuật toán tìm kiếm cho một
tương ứng 3- màu của các đỉnh bằng cách sử dụng các thiết lập của các màu {1, 2, 3} đại diệnbởi màu xanh lá cây, đỏ và màu xanh tương ứng
Trang 13Hình 03.Các đồ thị đầu vào G với 3- màu tương ứng của các đỉnh của nó được tìm thấy bởi
Trang 14Hình 04: tích đề các G×K 3 với một tập độc lập với kích thước 4 được tìm thấy bằng thuật toán
Thuật toán bây giờ tìm kiếm một tập độc lập với kích thước 4 trong tích đề các G × K 3 Phần I cho i = 1 và j = 1 khởi tạo tập độc lập như S 1,1 = {(1, 1)}.
Bây giờ chúng ta thực hiện các thủ tục 1 Sau đây là các kết quả dưới dạng bảng:
Trang 15Tối đa ρ (1,1 S ∪ {(u, v)}) = 0 với (v, u) = (4, 2) Thêm đỉnh (4, 2) để S 1,1.
Chúng ta có được một tập độc lập tối đa
của kích thước yêu cầu n = 4 Bây giờ đầu ra phần III S 1,1 được yêu cầu đúng 3-màu của đầu vào đồ thị G và thuật toán kết thúc Lưu ý rằng chúng ta giải thích kết quả như sau: đỉnh
1 được tô với màu 1 (màu xanh), đỉnh 2 được tô với màu 2 (màu đỏ), đỉnh 3 được tô với màu
3 (màu xanh) và đỉnh 4 được tô với màu 2 ( màu đỏ)
1.4 Độ phức tạp:
Tiếp theo để đánh giá độ phức tạp của giải thuật, nhóm sẽ chỉ ra rằng thuật toán kết thúc trong
thời gian đa thức, trong khi tìm kiếm một tập m-màu cho một đồ thị với n đỉnh, bằng cách xác định một đa thức của N=nm đó là một cận trên trên tổng số bước tính toán thực hiện bởi thuật
toán.Lưu ý rằng chúng ta xem xét
Trang 16 so sánh xem một số nguyên cho trước nhỏ hơn một số nguyên cho trước được tính toán
cận nm và cho mỗi lân cận phải mất ít hơn nm bước để kiểm tra xem nó là ở ngoài tập độc
lập Đối với một tập độc lập riêng, việc tìm kiếm số ρ của các đỉnh có thể thêm mất ít
tra xem nó có thể thêm hay không Đối với một tập độc lập riêng, việc tìm kiếm một đỉnh sao
Để tìm một đỉnh (u 1, v 1) bên ngoài S mà có đúng một lân cận (u 2, v 2) bên trong S có tối đa
(nm) 2 bước, khi có ít hơn nm đỉnh ngoài S và chúng ta phải tìm ra nếu ít nhất một trong các lân cận bé hơn nm của bất kỳ đỉnh nào ở trong S Nếu như một đỉnh (u 1, v 1) đã được tìm thấy, phải mất một bước để hoán đổi (u 1, v 1) và (u 2, v 2) Sau đó, bằng mệnh đề 4.1, phải mất ít
thực hiện Có nm lượt cho i = 1, 2, , n, và j = 1, 2, , m, do đó, một phần I thực hiện tổng cộng tối đa là nm((nm) 5 + (nm) 6 + (nm) 3 +nm) = (nm) 6 + (nm) 7 + (nm) 4 + (nm) 2 bước
Trang 17Mệnh Đề 4
Cho một đơn đồ thị G với n đỉnh và m màu, thuật toán mất ít
hơn (nm) 8 +2 (nm) 7 + (nm) 6 + (nm) 5 +(nm) 4 + (nm) 3 + (nm) 2 bước để kết thúc
Chứng minh
hiện lần lượt Tương tự như các thực nghiệm về mệnh đề 3, phần II có ít
hơn(nm) 2 nm (() 5 nm (+ ) 6 + (nm) 3 + nm) = (nm) 7 + (nm) 8 +(nm) 5 + (nm) 3). Do đó, phần I và
phần II cùng nhau mất ít hơn tổng cộng của ((nm 7 + (nm) 6 + (nm) 4 + (nm) 2) + ((nm) 8 +
(nm) 7 + (nm) 5 + (nm) 3) = (nm) 8 +2 (nm) 7 + (nm) 6 + (nm) 5+ (nm) 4 + (nm) 3 + (nm) 2 bước để kết thúc
2 Bài toán tô mầu cạnh
Về thuật toán giải quyết bài toán tô màu cạnh đồ thị hiện nay trên thế giới có nhiều thuật toánđược đề suất như
Trong đó thuật toán tô màu theo dãy lại được ứng dụng theo nhiều cách khác nhau
Ý tưởng của thuật toán này xoay quanh việc sắp xếp thứ tự các cạnh của đồ thị theo một thứ
tự nhất định Đánh trọng số cho các màu được dung để tô Sau đó duyệt các cạnh theo thứ tự nêutrên Trong quá trình duyệt sẽ tô màu cho cạnh bằng màu có trọng số nhỏ nhất mà chưa được sửdụng để tô cho các cạnh kề Đây là một vận dụng của sử dụng thuật toán tham lam Kết quả củabài toán khác nhau nếu chúng ta chọn được thứ tự của các cạnh khác nhau Do đó các cải tiếnhay các thuật toán khác nhau dựa trên thuật toán này hầu hết đều là cải tiến việc lựa chọn thứ tựcho các cạnh ban đầu
Trong chương trình ứng dụng của nhóm, giải thuật đưa ra ở mức minh hoạ một cách tô màucạnh của đồ thị vô hướng Trong đó, việc xếp thứ tự của đỉnh được đồng nghĩa với thứ tự cácđỉnh được sắp xếp của đầu vào Do đó thuật toán được thu gọn như sau :
số theo thứ tự E1, E2, ,En
để tô màu cạnh kề của nó Trong đó ở bước i tùy theo cách cài đặt sẽ có những cách đánh màu khác nhau
Trang 18Với thuật toán trên chúng ta có thể tìm được 1 cách tô màu cho các cạnh của đồ thị với sốmàu không quá Δ+1 màu ( vấn đề này sẽ thấy rõ hơn khi đi sâu vào phần cài dặt) Vậy đó đã là
số màu nhỏ nhất hay chưa Theo định lý Vizing chúng ta phát biểu ở trên, ta có Δ(G)≤ χ′(G) ≤ Δ(G) + 1 Vậy sắc số cạnh chỉ có thể nằm ở 1 trong hai giá trị là Δ(G) và Δ(G) + 1 Với việc chọn số màu lớn nhất có thể tô là Δ(G)+1, thuật toán đã kẹp được cận trên của sắc số cạnh Với
việc lựa chọn màu có chỉ số nhỏ nhất chưa được sử dụng để tô các cạnh kề cho một cạnh, số màuđược sử dụng là số màu nhỏ nhất
2.2 Ví dụ
Ta có đồ thị sau:
Ta sắp xếp các cạnh theo thứ tự như sau:
Trang 19Bước 1 : tô màu cạnh thứ 1
Cạnh này tô màu đỏ trước tiênBước 2 : tô màu cạnh 2
Cạnh 2 kề với cạnh 1 (tô màu đỏ) do đó cạnh 2 sẽ tô màu xanh lá cây
Bước 3: tô màu cạnh 3
Trang 20Cạnh 3 kề với cạnh 1 (tô màu đỏ), cạnh 2 (tô màu xanh lá cây) do đó cạnh 3 phải tô màu xanh da
trời
Trang 21Bước 4: tô màu cạnh 4
Cạnh 4 kề với cạnh 1 (tô màu đỏ) nên sẽ tô màu xanh lá cây
Bước 5: tô màu cạnh 5
Trang 22Cạnh 5 kề với cạnh 3 (tô màu xanh da trời), cạnh 4 (tô màu xanh lá cây) nên cạnh 5 tô màu đỏ
Trang 23Bước 6: tô màu cạnh 6
Cạnh 6 kề với cạnh 1,5 (tô màu đỏ), cạnh 3 (tô màu xanh da trời), cạnh 4 (tô màu xanh lá cây)
nên cạnh 6 phải tô màu tím
Bước 7: tô màu cạnh 7
Trang 24Cạnh 7 kề với cạnh 2 (tô màu xanh lá cây), cạnh 3 (tô màu xanh da trời), cạnh 5 (tô màu đỏ),
cạnh 6 (tô màu tím) do đó cạnh này tô màu vàng
Trang 25Bước 8: tô màu cho cạnh thứ 8
Cạnh 8 kề với cạnh 5 (tô màu đỏ), cạnh 7 (tô màu vàng) nên sẽ tô màu xanh lá cây
Bước 9: tô màu cạnh 9
Trang 26Cạnh 9 kề với cạnh 4 (tô màu xanh lá cây), cạnh 5 (tô màu đỏ) nên sẽ tô màu xanh da trời
Kết luận: Đồ thị này có thể tô được với 5 màu Mặt khác Δ = 5 nên đây chính là số màu nhỏ nhất
có thể dùng để tô cạnh của đồ thị trong trường hợp này
2.3 Độ phức tạp:
III.CÀI ĐẶT THUẬT TOÁN
Trong phần cài đặt này bài toán tô mầu cạnh có 2 cách nhập dữ liệu (bằng file và nhập từ bànphím), bài toán tô mầu đỉnh cho phép nhập dữ liệu từ file
Menu chương trình hiển thị các lựa chọn nhập dữ liệu:
Trang 271 Bài toán tô mầu đỉnh
- Cài đặt:
Đọc dữ liệu từ file: graph.txt
Kết quả sẽ trả ra ở file: coloring.txt
- Mã nguồn chương trình
Bool removable(vector< int > neighbor, vector< int > cover);
int max_removable(vector<vector< int > > neighbors, vector< int > cover);
vector< int > procedure_1(vector<vector< int > > neighbors, vector< int > cover);
vector< int > procedure_2(vector<vector< int > > neighbors, vector< int > cover, int k);
int cover_size(vector< int > cover);
ifstream infile ( "graph.txt" );
ofstream outfile ( "coloring.txt" );
int main() //hàm chính
{
//Read Graph
cout<< "Vertex Coloring Algorithm." <<endl;
int C, N, n, i, j, k, K, p, q, r, s, min, edge, counter= 0 ;
infile>>N;
vector< vector< int > > Graph;
for (i= 0 ; i<N; i++)
Trang 28}
Graph.push_back(row);
}
//COLORING to INDEPENDENT SET conversion
cout<< "Graph has N = " <<N<< " vertices." <<endl;
cout<< "Find a vertex coloring using at most C colors Enter C = " ;
cin>>C;
//Complete garph on C verteices
vector<vector< int > > KC;
vector< int > row1;
for ( int i= 0 ; i<C; i++) row1.push_back( 1 );
for ( int i= 0 ; i<C; i++) KC.push_back(row1);
for ( int i= 0 ; i<C; i++) KC[Δ(i][Δ(i]= 0 ;
//Cartesian product of Graph and KC
vector<vector< int > > graph;
vector< int > rowind;
for ( int i= 0 ; i<C*N; i++) rowind.push_back( 0 );
for ( int i= 0 ; i<C*N; i++) graph.push_back(rowind);
for ( int i= 0 ; i<C*N; i++)
for ( int j= 0 ; j<C*N; j++)
{
int i_G=i/C, i_KC=i%C, j_G=j/C, j_KC=j%C;
if ((i_G==j_G) && (KC[Δ(i_KC][Δ(j_KC]== 1 )) graph[Δ(i][Δ(j]= 1 ;
if ((Graph[Δ(i_G][Δ(j_G]== 1 ) && (i_KC==j_KC)) graph[Δ(i][Δ(j]= 1 ;
}
//Assign parameters for finding independent sets in the graph
//Find Neighbors
vector<vector< int > > neighbors;
for (i= 0 ; i<graph.size(); i++)
//Find Independent Sets
bool found= false ;
cout<< "Finding Vertex Colorings " <<endl;
min=n+ 1 ;
vector<vector< int > > covers;
vector< int > allcover;
for (i= 0 ; i<graph.size(); i++)
allcover.push_back( 1 );
Trang 29for (i= 0 ; i<allcover.size(); i++)
{
if (found) break ;
counter++; cout<<counter<< " " ; outfile<<counter<< " " ;
vector< int > cover=allcover;
outfile<< "Vertex Coloring (" <<ns<< "): " ;
for (j= 0 ; j<cover.size(); j++) if (cover[Δ(j]== 0 ) outfile<< "(" <<j/C+ 1 << "," <<j
outfile<< "Vertex Coloring (" <<ns<< "): " ;
for (j= 0 ; j<cover.size(); j++) if (cover[Δ(j]== 0 ) outfile<< "(" <<j/C+ 1 << "," <<j
counter++; cout<<counter<< " " ; outfile<<counter<< " " ;
vector< int > cover=allcover;
for (r= 0 ; r<cover.size(); r++)
if (covers[Δ(p][Δ(r]== 0 && covers[Δ(q][Δ(r]== 0 ) cover[Δ(r]=0 ;
cover=procedure_1(neighbors,cover);
s=cover_size(cover);
Trang 30if (s<min) min=s;
if (s<=k)
{
outfile<< "Vertex Coloring (" <<ns<< "): " ;
for (j= 0 ; j<cover.size(); j++) if (cover[Δ(j]== 0 ) outfile<< "(" <<j/C+ 1 << "," <<j
outfile<< "Vertex Coloring (" <<ns<< "): " ;
for (j= 0 ; j<cover.size(); j++) if (cover[Δ(j]== 0 ) outfile<< "(" <<j/C+ 1 << "," <<j
%C+ 1 << ") " ;
outfile<<endl;
cout<< "Vertex Coloring Size: " <<ns<<endl;
if (s<=k){ found= true ; break ; }
<< "Maximum partial Vertex Coloring found for " <<n-min<< " vertices." <<endl;
cout<< "See coloring.txt for results." <<endl;
bool check= true ;
for ( int i= 0 ; i<neighbor.size(); i++)
Trang 31int max_removable(vector<vector< int > > neighbors, vector< int > cover)
for ( int j= 0 ; j<temp_cover.size(); j++)
if (temp_cover[Δ(j]== 1 && removable(neighbors[Δ(j], temp_cover)== true )
Trang 32for ( int j= 0 ; j<neighbors[Δ(i].size(); j++)
if (temp_cover[Δ(neighbors[Δ(i][Δ(j]]== 0 ) {index=j; sum++;}
if (sum== 1 && cover[Δ(neighbors[Δ(i][Δ(index]]== 0 )
tìm được đúng m-màu của các đỉnh cho m = χ( G ) = 2