Tô màu đồ thị trong việc sắp xếp sách theo từng loại trên cùng một kệ trong thư viện
Trang 1kimMỤC LỤC
1.Phần Mở Đầu
I.1 Lý do Chọn đề tài 3
I.2 Đối tượng nghiên cứu 3
I.3 Nhiệm vụ nghiên cứu .3
I.4 Phương nghiên cứu .3
I.5 Kế hoạch nghiên cứu .3
2 Phần Nội Dung 2.1 Cơ sở lý thuyết 4
2.1.1 Mô tả bài toán 4
2.1.2 Thuật toán tô màu đồ thị 4
2.1.3 Xây dựng chương trình 4
2.2 Đồ Thị 5
2.3 Ma Trận trọng số 6
2.4 Cài đạt Thuật Toán ( Code ) Tô Màu Đồ Thị : .6
2.5 Chạy Thuật Toán .9
2.6 Đánh giá giải thuật 17
3 KẾT LUẬN .17
4 Tài Liệu tham khảo: .17
Trang 2NHẬN XÉT
Trà vinh,ngày tháng năm GVHD
TRẦN QUANG HÀ
Trang 31.Phần Mở Đầu
I.6 Lý do Chọn đề tài
Qua lý thuyết đến những ứng dụng thực tế, môn lý thuyết đồ thị dã thực sự góp phần không ít vào đời sống hàng ngay cua chúng ta Bài toán to màu đồ thị là một trong những bài toán được ứng dung kha rông như: Tô màu bản đồ, sấp xếp lịch thi cho sinh viên, phân chia tần số gia các đài, sấp xếp sách trong thư viện….Vi vậy, việc nghiên cứu rất cần thiết cho việc giải quyết những vấn đề rắt rối trong công việc cua chúng ta Do đó, em chọn đề tài :”
Tô màu đồ thị trong việc sấp xếp sách theo từng loại trên cùng một kệ trong thư viện “
để hy vọng giúp một phần nào đó cho thư viện
I.7 Đối tượng nghiên cứu
Sấp xếp những quyển sách cùng một loại thì ở cùng một kệ Mỗi kệ được dùng tương ứng với bấy nhiêu loại sách ma ta sự dụng trong thư viện
I.8 Nhiệm vụ nghiên cứu
Tìm hiểu tính thực dụng của đề tài
I.9 Phương nghiên cứu
Khảo sát, Phân tích, thiết kế, lập trình ( viết code )
I.10 Kế hoạch nghiên cứu
Tuần 1: đưa ra ý tưởng, nghiên cứu đề tài
Tuần 2: xây dựng đề tài
Tuần 3: viết chưong trình
Tuần 4: viết bài báo cáo
Tuần 5: báo cáo và bảo vệ báo cáo (bảo vệ đề tài )
2 Phần Nội Dung
Trang 42.1 Cơ sở lý thuyết
2.1.1 Mô tả bài toán
Sự dung phương pháp tô màu đồ thị để bố trí sách theo từng loại vào từng kể của của loại sách đó Yêu cầu, bố trí sách sau cho hai sách kề nhau không cùng một loại
Vi dụ:
1 lập trình C++
2 Đại số tuyến tính
3 lập trình C#
4 photoshop
5 lập trình Java
6 Tư tưởng HCM
7 Flash
8 Toán rời rạc
2.1.2 Thuật toán tô màu đồ thị
Input: đồ thị G = (V, E)
Output: đồ thị G = (V, E) có các đỉnh đã được gán màu
Bước 1 :tô màu 1 cho đỉnh 1
Bước 2 :tô màu cho các đỉnh i (i=2,3,4, ,n) theo quy tắc.Gọi MAU là tập các màu đã tô cho các đỉnh kề với i.Chọn số nguyên dương nhỏ nhất chưa có trong tập MAU để tô màu cho đỉnh i
2.1.3 Xây dựng chương trình
Các đỉnh được sắp theo bậc.Đầu tiên gán màu 1 cho đỉnh 1.Xét tiếp các đỉnh để tô màu cho các đỉnh còn lại.Quá trình tô màu cho các đỉnh được xét bởi các vòng lặp nhỏ để kiểm tra tính liên thông,nếu liên thông sẽ không được gán trùng màu và ngược lại
Quá trình được lặp lại cho đến khi không còn đỉnh nào chưa được tô
2.2 Đồ Thị
Trang 52.3 Ma Trận trọng số
Trang 62.4 Cài đạt Thuật Toán ( Code ) Tô Màu Đồ Thị :
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#define max 50
int n,b[50],a[max][max];
void to(int n)
{
switch(n)
Trang 7case 1:
printf(" xanh luc ");
break;
case 2:
printf(" do ");
break;
case 3:
printf(" vang ");
break;
case 4:
printf(" tim ");
break;
case 5:
printf(" hong ");
break;
case 6:
printf(" cam ");
break;
} }
void docfile(void)
{
FILE *fp;
int i,j;
fp=fopen("d:\\tomau.txt","rt");
fscanf(fp,"%d",&n);
printf(" ma tran ke la ");
for (i=1;i<=n;i++)
Trang 8{ printf("\n");
for (j=1;j<=n;j++)
{
fscanf(fp,"%d",&a[i][j]);
printf("%3d",a[i][j]);
} }
fclose(fp);
}
void Tomau()
{ int i,j;
b[1]=1;//đỉnh 1 được tô bằng màu 1 for (i=2;i<=n;i++ )//biến chạy từ đỉnh thứ 2->n {
b[i]=1;//đỉnh i được tô bằng màu 1
nhan:
for (j=1;j<=i-1;j++)// biến chạy nửa dưới đường đối xứng của ma trận
if (a[i][j]!=0&&b[i]==b[j])//điều kiện 2đỉnh liên thông và 2 đỉnh tô
cùng màu
b[i]++;//tăng màu đỉnh i for (j=1;j<=n;j++)//biến chạy từ 1->n ktra đỉnh vừa mới tô
if(a[i][j]!=0&&b[i]==b[j])// điều kiện 2 đỉnh liên thông và 2 đỉnh tô cùng màu
goto nhan;
}
}
void xuat(void)
{ printf(" \nto mau cac dinh la ");
for(int i=1;i<=n;i++)
Trang 9printf("\n dinh %d to mau ",i,b[i]);
to(b[i]);
}
printf("\n");
}
void main()
{ clrscr();
docfile();
Tomau();
xuat();
getch();
}
2.5 Chạy Thuật Toán
Tảo File notepad, nhập ma trận trọng số trên và lưu với tên tomaudothi.txt (n=8) ở
Local Disk (D:)
Dùng hàm docfile: để mở ma trận trọng số (được lưu trong notepad)
Dùng hàm tomau: để tiến hành tô màu cho các đỉnh theo các bước:
Ban đầu gán màu 1 cho đỉnh 1: mau[1]=1 (Xanh lam)
Màu 1(Xanh)
Chạy vòng lặp for(i=2;i<=n;i++)
Khi i=2 điều kiện i<=n (2<=8) đúng.
b[2]=1: đỉnh 2 được tô màu 1
Xét tiếp vòng lập for(j=1; j<=i-1; j++)
j=1; i=2 1<=1 (đúng) <=> a[2][1] !=0 và b[1]=b[2] (đúng)
b[2]++ : tô màu 2 cho đỉnh 2
Trang 10j=2 ;i=2 ;2<=1 (sai) thoát khỏi dòng lặp for Xét tiếp vòng lặp for(j=1; j<=n; j++)
j=1; n=8; 1<=8 (đúng) <=> a[2][1] !=0 và b[2]=b[1] (sai)
không thực hiện lệnh ‘go to nhan’
j=2; n=8; 2<=8 (đúng) <=> a[2][2] !=0 và b[2]=b[2] (sai)
không thực hiện lệnh ‘go to nhan’
j=3; n=8; 3<=8 (đúng) <=> a[2][3] !=0 và b[2]=b[3] (sai)
không thực hiện lệnh ‘go to nhan’
j=4; n=8; 4<=8 (đúng) <=> a[2][4] !=0 và b[2]=b[4] (sai)
không thực hiện lệnh ‘go to nhan’
j=5; n=8; 5<=8 (đúng) <=> a[2][5] !=0 và b[2]=b[5] (sai)
không thực hiện lệnh ‘go to nhan’
j=6; n=8; 6<=8 (đúng) <=> a[2][6] !=0 và b[2]=b[6] (sai)
không thực hiện lệnh ‘go to nhan’
j=7; n=8; 6<=8 (đúng) <=> a[2][7] !=0 và b[2]=b[7] (sai)
không thực hiện lệnh ‘go to nhan’
j=8; n=8; 6<=8 (đúng) <=> a[2][8] !=0 và b[2]=b[8] (sai)
không thực hiện lệnh ‘go to nhan’
j=9; n=8; 9<=8 (sai) thoát khỏi dòng lặp for (j=1 ;j<=n ;j++)
lúc này ta có mảng b[] như sau:
Màu 1(Xanh) 2(Đỏ)
Quay trở lên dòng lặp for(i=2 ;i<=n ;i++) tiếp tục tăng i=3
Khi i=3 điều kiện i<=n (3<=8) đúng.
b[3]=1 :đỉnh 3 được tô màu 1
Xét dòng lặp for(j=1;j<=i-1;j++)
j=1; i=3 1<=2 (đúng) <=> a[3][1] !=0 và b[1]=b[3] (sai)
không thực hiện : b[3]++
Trang 11j=2; i=3 2<=2 (đúng) <=> a[3][2] !=0 và b[2]=b[3] (sai) j=3; i=3 3<=2 (sai) thoát khỏi dòng lặp for
Xét tiếp dòng lặp for(j=1 ;j<=n ;j++)
j=1; n=6 1<=6 (đúng) <=> a[3][1] !=0 và b[3]=b[1] (sai)
không thực hiện lệnh ‘go to nhan’
j=2; n=8 2<=8 (đúng) <=> a[3][2] !=0 và b[3]=b[2] (sai)
j=3; n=8 3<=8 (đúng) <=> a[3][3] !=0 và b[3]=b[3] (sai)
j=4; n=8 4<=8 (đúng) <=> a[3][4] !=0 và b[3]=b[4] (đúng)
Thực hiện lệnh ‘ go to nhan ’ i=3 ; j=4 4<=2 (sai) <=> thoát dòng lập for
j=5; n=8 5<=8 (đúng) <=> a[3][5] !=0 và b[3]=b[5] (sai)
j=6; n=8 6<=8 (đúng) <=> a[3][6] !=0 và b[3]=b[6] (sai)
j=7; n=8 7<=8 (đúng) <=> a[3][7] !=0 và b[3]=b[7] (sai)
j=8; n=8 8<=8 (đúng) <=> a[3][8] !=0 và b[3]=b[8] (đúng)
Thực hiện lệnh ‘ go to nhan ’
i=3 ; j=8 8<=2 (sai) <=> thoát dòng lập for
j=9; n=8 9<=8 (sai) : thoát khỏi dòng lặp for (j=1 ;j<=n ;j++)
lúc này ta có mảng b[] như sau:
Màu 1(Xanh) 2(Đỏ) 1(Xanh)
Quay trở lên dòng lặp for(i=2 ;i<=n ;i++) tiếp tục tăng i=4
Khi i=4 điều kiện i<=n (4<=8) đúng.
b[4]=1 :đỉnh 4 được tô màu 1
Xét dòng lặp for(j=1;j<=i-1;j++)
j=1; i=4 1<=3 (đúng) <=> a[4][1] !=0 và b[1]=b[4] (sai)
không thực hiện : b[3]++
j=2; i=4 2<=3 (đúng) <=> a[4][2] !=0 và b[2]=b[4] (sai)
Trang 12j=3; i=4 3<=3 (đúng) <=> a[4][3] !=0 và b[3]=b[4] (đúng) b[4]++ : tô màu 2 cho đỉnh 4
j=4; i=4 4<=3 (sai) thoát khỏi dòng lặp for
Xét tiếp dòng lặp for(j=1 ;j<=n ;j++)
j=1; n=6 1<=6 (đúng) <=> a[4][1] !=0 và b[4]=b[1] (sai)
không thực hiện lệnh ‘go to nhan’
j=2; n=8 2<=8 (đúng) <=> a[4][2] !=0 và b[4]=b[2] (sai)
j=3; n=8 3<=8 (đúng) <=> a[4][3] !=0 và b[4]=b[3] (sai)
j=4; n=8 4<=8 (đúng) <=> a[4][4] !=0 và b[4]=b[4] (sai)
j=5; n=8 5<=8 (đúng) <=> a[4][5] !=0 và b[4]=b[5] (sai)
j=6; n=8 6<=8 (đúng) <=> a[4][6] !=0 và b[4]=b[6] (sai)
j=7; n=8 7<=8 (đúng) <=> a[4][7] !=0 và b[4]=b[7] (sai)
j=8; n=8 8<=8 (đúng) <=> a[4][8] !=0 và b[4]=b[8] (sai)
j=9; n=8 9<=8 (sai) thoát khỏi dòng lặp for (j=1 ;j<=n ;j++)
lúc này ta có mảng b[] như sau :
Màu 1(Xanh) 2(Đỏ) 1(Xanh) 2(Đỏ)
Quay trở lên dòng lặp for(i=2 ;i<=n ;i++) tiếp tục tăng i=5
Khi i=5 điều kiện i<=n (5<=8) đúng.
b[5]=1 :đỉnh 5 được tô màu 1
Xét dòng lặp for(j=1;j<=i-1;j++)
j=1; i=5 1<=4 (đúng) <=> a[5][1] !=0 và b[1]=b[5] (sai)
không thực hiện : b[3]++
j=2; i=5 2<=4 (đúng) <=> a[5][2] !=0 và b[2]=b[5] (sai) j=3; i=5 3<=4 (đúng) <=> a[5][3] !=0 và b[3]=b[5] (sai) j=4; i=5 4<=4 (đúng) <=> a[5][4] !=0 và b[4]=b[5] (sai)
j=5; i=5 5<=4 (sai) thoát khỏi dòng lặp for
Trang 13Xét tiếp dòng lặp for(j=1 ;j<=n ;j++)
j=1; n=8 1<=8 (đúng) <=> a[5][1] !=0 và b[5]=b[1] (sai)
không thực hiện lệnh ‘go to nhan’
j=2; n=8 2<=8 (đúng) <=> a[5][2] !=0 và b[5]=b[2] (sai)
j=3; n=8 3<=8 (đúng) <=> a[5][3] !=0 và b[5]=b[3] (sai)
j=4; n=8 4<=8 (đúng) <=> a[5][4] !=0 và b[5]=b[4] (sai)
j=5; n=8 5<=8 (đúng) <=> a[5][5] !=0 và b[5]=b[5] (sai)
j=6; n=8 6<=8 (đúng) <=> a[5][6] !=0 và b[5]=b[6] (đúng)
Thực hiện lệnh ‘ go to nhan ’
i=5 ; j=6 6<=4 (sai) <=> thoát dòng lập for
j=7; n=8 7<=8 (đúng) <=> a[5][7] !=0 và b[5]=b[7] (đúng)
Thực hiện lệnh ‘ go to nhan ’
i=5 ; j=7 7<=4 (sai) <=> thoát dòng lập for
j=8; n=8 8<=8 (đúng) <=> a[5][8] !=0 và b[5]=b[8] (đúng)
Thực hiện lệnh ‘ go to nhan ’
i=5 ; j=8 8<=4 (sai) <=> thoát dòng lập for
j=9; n=8 9<=8 (sai) thoát khỏi dòng lặp for (j=1 ;j<=n ;j++)
lúc này ta có mảng b[] như sau:
Màu 1(Xanh) 2(Đỏ) 1(Xanh) 2(Đỏ) 1(Xanh)
Quay trở lên dòng lặp for(i=2 ;i<=n ;i++) tiếp tục tăng i=6
Khi i=6 điều kiện i<=n (6<=8) đúng.
b[6]=1 :đỉnh 6 được tô màu 1
Xét dòng lặp for(j=1;j<=i-1;j++)
j=1; i=6 1<=4 (đúng) <=> a[6][1] !=0 và b[6]=b[1] (đúng)
mau[6]++ : tô màu 2 cho đỉnh 6
j=2; i=6 2<=5 (đúng) <=> a[6][2] !=0 và b[6]=b[2] (sai)
Trang 14j=3; i=6 3<=5 (đúng) <=> a[6][3] !=0 và b[6]=b[3] (sai) j=4; i=6 4<=5 (đúng) <=> a[6][4] !=0 và b[6]=b[4] (sai)
j=5; i=6 5<=5 (đúng) <=> a[6][5] !=0 và b[6]=b[5] (sai) j=6; i=6 6<=5 (sai) thoát khỏi dòng lặp for
Xét tiếp dòng lặp for(j=1 ;j<=n ;j++)
j=1; n=8 1<=8 (đúng) <=> a[6][1] !=0 và b[6]=b[1] (sai)
không thực hiện lệnh ‘go to nhan’
j=2; n=8 2<=8 (đúng) <=> a[6][2] !=0 và b[6]=b[2] (sai)
j=3; n=8 3<=8 (đúng) <=> a[6][3] !=0 và b[6]=b[3] (sai)
j=4; n=8 4<=8 (đúng) <=> a[6][4] !=0 và b[6]=b[4] (sai)
j=5; n=8 5<=8 (đúng) <=> a[6][5] !=0 và b[6]=b[5] (sai)
j=6; n=8 6<=8 (đúng) <=> a[6][6] !=0 và b[6]=b[6] (sai)
j=7; n=8 7<=8 (đúng) <=> a[6][7] !=0 và b[6]=b[7] (sai)
j=8; n=8 8<=8 (đúng) <=> a[6][8] !=0 và b[6]=b[8] (sai)
j=9; n=8 9<=8 (sai) thoát khỏi dòng lặp for (j=1 ;j<=n ;j++)
lúc này ta có mảng như sau:
Màu 1(Xanh) 2(Đỏ) 1(Xanh) 2(Đỏ) 1(Xanh) 2(Đỏ)
Quay trở lên dòng lặp for(i=2 ;i<=n ;i++) tiếp tục tăng i=7
Khi i=7 điều kiện i<=n (7<=8) đúng.
b[7]=1 :đỉnh 7 được tô màu 1
Xét dòng lặp for(j=1;j<=i-1;j++)
j=1; i=7 1<=6 (đúng) <=> a[7][1] !=0 và b[7]=b[1] (đúng)
mau[7]++ : tô màu 2 cho đỉnh 7
Trang 15j=2; i=7 2<=6 (đúng) <=> a[7][2] !=0 và b[7]=b[2] (đúng)
mau[7]++ : tô màu 3 cho đỉnh 7
j=3; i=7 3<=6 (đúng) <=> a[7][3] !=0 và b[7]=b[3] (sai)
j=4; i=7 4<=6 (đúng) <=> a[7][4] !=0 và b[7]=b[4] (sai)
j=5; i=7 5<=6 (đúng) <=> a[7][5] !=0 và b[7]=b[5] (sai) j=6; i=7 6<=6 (đúng) <=> a[7][5] !=0 và b[7]=b[5] (sai) j=7; i=7 7<=6 (sai) thoát khỏi dòng lặp for
Xét tiếp dòng lặp for(j=1 ;j<=n ;j++)
j=1; n=8 1<=8 (đúng) <=> a[7][1] !=0 và b[7]=b[1] (sai)
không thực hiện lệnh ‘go to nhan’
j=2; n=8 2<=8 (đúng) <=> a[7][2] !=0 và b[7]=b[2] (sai)
j=3; n=8 3<=8 (đúng) <=> a[7][3] !=0 và b[7]=b[3] (sai)
j=4; n=8 4<=8 (đúng) <=> a[7][4] !=0 và b[7]=b[4] (sai)
j=5; n=8 5<=8 (đúng) <=> a[7][5] !=0 và b[7]=b[5] (sai)
j=6; n=8 6<=8 (đúng) <=> a[7][6] !=0 và b[7]=b[6] (sai)
j=7; n=8 7<=8 (đúng) <=> a[7][7] !=0 và b[7]=b[7] (sai)
j=8; n=8 8<=8 (đúng) <=> a[7][8] !=0 và b[7]=b[8] (sai)
j=9; n=8 9<=8 (sai) thoát khỏi dòng lặp for (j=1 ;j<=n ;j++)
lúc này ta có mảng như sau:
Màu 1(Xanh) 2(Đỏ) 1(Xanh) 2(Đỏ) 1(Xanh) 2(Đỏ) 3(Vàng)
Quay trở lên dòng lặp for(i=2 ;i<=n ;i++) tiếp tục tăng i=6
Khi i=8 điều kiện i<=n (8<=8) đúng.
b[8]=1 :đỉnh 8 được tô màu 1
Xét dòng lặp for(j=1;j<=i-1;j++)
j=1; i=8 1<=7 (đúng) <=> a[8][1] !=0 và b[8]=b[1] (sai)
j=2; i=8 2<=7 (đúng) <=> a[8][2] !=0 và b[8]=b[2] (sai)
Trang 16j=3; i=8 3<=7 (đúng) <=> a[8][3] !=0 và b[8]=b[3] (đúng)
mau[8]++ : tô màu 2 cho đỉnh 8
j=4; i=8 4<=7 (đúng) <=> a[8][4] !=0 và b[8]=b[4] (đúng)
mau[8]++ : tô màu 3 cho đỉnh 8
j=5; i=8 5<=7 (đúng) <=> a[8][5] !=0 và b[8]=b[5] (sai) j=6; i=8 6<=7 (đúng) <=> a[8][6] !=0 và b[8]=b[6] (sai) j=7; i=8 7<=7 (đúng) <=> a[8][7] !=0 và b[8]=b[7] (đúng)
mau[8]++ : tô màu 4 cho đỉnh 8
j=8; i=8 8<=7 (sai) thoát khỏi dòng lặp for Xét tiếp dòng lặp for(j=1 ;j<=n ;j++)
j=1; n=8 1<=8 (đúng) <=> a[8][1] !=0 và b[8]=b[1] (sai)
không thực hiện lệnh ‘go to nhan’
j=2; n=8 2<=8 (đúng) <=> a[8][2] !=0 và b[8]=b[2] (sai)
j=3; n=8 3<=8 (đúng) <=> a[8][3] !=0 và b[8]=b[3] (sai)
j=4; n=8 4<=8 (đúng) <=> a[8][4] !=0 và b[8]=b[4] (sai)
j=5; n=8 5<=8 (đúng) <=> a[8][5] !=0 và b[8]=b[5] (sai)
j=6; n=8 6<=8 (đúng) <=> a[8][6] !=0 và b[8]=b[6] (sai)
j=7; n=8 7<=8 (đúng) <=> a[8][7] !=0 và b[8]=b[7] (sai)
j=8; n=8 8<=8 (đúng) <=> a[8][8] !=0 và b[8]=b[8] (sai)
j=9; n=8 9<=8 (sai) thoát khỏi dòng lặp for (j=1 ;j<=n ;j++)
lúc này ta có mảng như sau:
Màu 1(Xanh) 2(Đỏ) 1(Xanh) 2(Đỏ) 1(Xanh) 2(Đỏ) 3(Vàng) 4(Tím)
Quay trở lên dòng lặp for(i=2 ;i<=n ;i++) tiếp tục tăng i=9
Khi i=9 điều kiện i<=n (9<=8) Sai
<=> Thoát khỏi vòng lập trong ham tomau và xuất ra màng hình Kết thúc chưong
trình
Trang 172.6 Đánh giá giải thuật
Với dòng lặp : for(int i=1;i<=n;i++) Độ phức tạp của nó là: n+1
Với dòng lặp : for(int j=1;j<=n;j++) Độ phức tạp của nó là: n+1
3 KẾT LUẬN
Chương trình đã được xây dựng qua các giai đoạn hoàn chỉnh: giai đoạn khảo sát, giai đoạn phân tích, giai đoạn thiết kế, giai đoạn lập trình và giai đoạn kiểm thử.
Đó là quá trình của việc nghiên cứu sau bốn tuần, với sự hướng dẫn tận tình của Thầy và sự giúp đỡ của bạn bè, em đã hoàn thành được bài báo cáo này Ty nhiên vẫn còn nhiều lỗi thiếu xót
Mong các ban thong cảm và giúp minh hoàng thiệt tốt hơn cho đêg tài
4 Tài Liệu tham khảo:
[1] Đặng Huy Ruận, Lý thuyết đồ thị và ứng dụng, Nhà xuất bản khoa học và kỹ
thuật - Hà nội 2000