Dữ liệu vào từ bàn phím

Một phần của tài liệu THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁNĐỀ TÀI 15: BÀI TOÁN TÔ MẦU ĐỒ THỊ (Trang 47 - 62)

MỤC LỤC

2.2. Dữ liệu vào từ bàn phím

- Cài đặt

• Sắp xếp các cạnh theo thứ tự E1, E2, ...,En • Tìm bậc lớn nhất của đồ thị (Δ)

• Chuẩn bị (Δ+1) màu để tô

• Bước i: tô cạnh Ei bởi màu có chỉ số nhỏ nhất trong số các màu chưa được sử dụng để tô cạnh kề của nó

Trong đó việc sắp xếp các cạnh theo thứ tự được người sử dụng nhập vào. - Mô tả chương trình và đánh giá độ phức tạp

• Trước tiên ta tổ chức các cạnh là một danh sách gồm 3 thông tin: - Đỉnh đầu của cạnh - Đỉnh cuối của cạnh - Màu của cạnh typedef struct { int dau; int cuoi; int mau; } Danhsachcanh;

• Để lưu những màu đã tô của cạnh giao tại một đỉnh ta tổ chức n mảng (n là số đỉnh) với độ lớn là (Δ+1) phần tử.

Trước hết ta đưa tất cả các phần tử này về 0 (chưa có màu nào được tô) Ta sử dụng con trỏ để trỏ tới vị trí mảng màu của một đỉnh:

int *p[20]; //mảng con trỏ đến các mảng màu của đồ thị

Để xác định vị trí của con trỏ của một đỉnh ta dùng đoạn code sau:

1 2

3 4

5

int temp[20]; //mảng lưu vị trí con trỏ của các đỉnh int j=0;

for (i=0;i<edge;i++) //thực hiện lưu vị trí con trỏ mảng màu của đỉnh {

if (temp[G[i].dau]<0) {temp[G[i].dau]=j;j++;} if (temp[G[i].cuoi]<0) {temp[G[i].cuoi]=j;j++;} }

• Để xác định bậc lớn nhất của đồ thị ta dùng hàm maxdegree: Độ phức tạp của hàm là O(E) với E là số cạnh của đồ thị

int maxdegree(Danhsachcanh a[],int edge) //hàm tìm bậc lớn nhất của đỉnh {

int temp[20];

for (int i=0;i<20;i++) temp[i]=0; for (i=0;i<edge;i++) { temp[a[i].dau-1]++; temp[a[i].cuoi-1]++; } int max=temp[0];

for (i=1;i<21;i++) if (max<temp[i]) max=temp[i]; return max;

}

int findcolor(int *a,int *b,int maxdegree) //Hàm tìm màu tô cho cạnh {

int i=0;

while (((a[i]>0)||(b[i]>0))&&(i<maxdegree+1)) i++; return i;

}

Hàm này sẽ duyệt 2 mảng màu của 2 đỉnh và đưa ra vị trí thứ i đầu tiên là vị trí mà chưa có màu nào được tô, tại vị trí đó các phần tử của 2 mảng đều bằng 0.

Ví dụ: với 2 mảng màu của 2 đỉnh 1 và 2

Thì hàm findcolor sẽ trả về giá trị là 2.

Thì hàm findcolor sẽ trả về giá trị là 3.

• Theo cách này thì cạnh đầu tiên sẽ luôn được tô là màu đỏ (màu đỏ là màu có chỉ số thấp nhất)

• Đoạn chương trình thực hiện tô màu từng cạnh, khi duyệt qua lần lượt mỗi cạnh sẽ thực hiện những công việc sau:

- Tìm vị trí thứ j là vị trí đầu tiên trong 2 mảng màu của 2 đỉnh chưa có màu tô - Sử dụng biến maxcolor để ghi nhận số màu lớn nhất khi đã tô cạnh này - Gán màu cho cạnh

- Lưu lại vị trí j trong mảng màu của 2 đỉnh thuộc cạnh

for (i=0;i<edge;i++)//duyet cac canh va to mau { j=findcolor(p[temp[G[i].dau]],p[temp[G[i].cuoi]],maxdeg); if(maxcolor<j+1) maxcolor=j+1; G[i].mau=j; *(p[temp[G[i].dau]]+j)=j+1; *(p[temp[G[i].cuoi]]+j)=j+1; }

Dựa vào những đánh giá trên và dựa vào chương trình nguồn ta có thể đánh giá được độ phức tạp của chương trình Cai_dat_2 này là : O(E+V2)

- Một ví dụ

• Ta có bậc lớn nhất: maxdeg=5. Mảng màu các đỉnh được tạo như sau:

• Các bước tô màu: Bước 1:

Bước 3:

Bước 4:

Bước 6:

Bước 8:

Bước 10:

Kết quả:

- Đồ thị tô được bởi 5 màu: red, blue, yellow, green, pink

• Cạnh 1(5,1): red • Cạnh 2(2,1): blue • Cạnh 3(4,5): blue • Cạnh 4(7,8): red • Cạnh 5(6,5): yellow • Cạnh 6(5,7): green • Cạnh 7(4,8): yellow • Cạnh 8(3,1): yellow • Cạnh 9(4,3): red • Cạnh 10(5,2): pink - Hướng dẫn sử dụng chương trình

Bước 1:Với cách cài đặt này người sử dụng phải tự nhập các đỉnh và các cạnh của đồ thị với quy tắc cho trước như sau:

• Yêu cầu người dùng nhập số đỉnh và số cạnh của đồ thị

• Với mỗi cạnh yêu cầu người dùng nhập vào 2 đỉnh là đỉnh đầu và đỉnh cuối Ví dụ như trong đồ thị trình bày ở trên ta có thể nhập như sau :

Với thứ tự nhập các cạnh: Cạnh Đỉnh đầu Đỉnh cuối 1 5 1 2 2 1 3 4 5 4 7 8 5 6 5 6 5 7 7 4 8 8 3 1 9 4 3 10 5 2

Bước 2: Xem từng bước các kết quả. Với cách cài đặt này, người sử dụng được xem từng bước của quá trình tính tóan, tô màu thực hiện trong chương trình. Ấn enter trong mỗi lần chuyển đến bước kế tiếp. Kết quả cuối cùng sẽ được hiện lên màn hình

- Kết quả thực nghiệm

Kết quả sẽ hiện ra theo từng cạnh và màu tương ứng Sau đây là kết quả của ví dụ trên theo từng bước

3. Mã nguồn

- File mã nguồn: Algo2010N15.cpp

- File biên dịch:Algo2010N15

- File dữ liệu đầu vào của cài đặt tô mầu cạnh: edge-coloring.txt

- File dữ liệu đầu vào của cài đặt tô mầu đỉnh: graph.txt

- File dữ liệu đầu ra của cài đặt tô mầu đỉnh: coloring.txt

IV. TÀI LIỆU THAM KHẢO

1. Bài giảng của thầy Nguyễn Đức Nghĩa.

2. Coloring random graphs : organization of solutión and computational hardness - Lenka Zdeborova’ và Florent Krzakala

3. Graph coloring problems and their applications in scheduling - Da’niel Mark

4. Graph coloring algorithms - Walter Klotz

5. Reducibility among combinatorial problems, Complexity of Computer Computations, Plenum Press, 1972- R.M. Karp

6. The Vertex Coloring Algorithm - Ashay Dharwadker 7. Các bài viết trên wikipedia và các trang web:

http://en.wikipedia.org/wiki/Register_allocation

http://en.wikipedia.org/wiki/Edge_coloring

PHỤ LỤC 1: DANH MỤC CÁC HÌNH ẢNH TRONG TÀI LIỆU

Một phần của tài liệu THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁNĐỀ TÀI 15: BÀI TOÁN TÔ MẦU ĐỒ THỊ (Trang 47 - 62)

Tải bản đầy đủ (DOC)

(63 trang)
w