Professional Documents
Culture Documents
kimMỤC LỤC
1.Phần Mở Đầu
I.1 Lý do Chọn đề tài ...................................................................3
NHẬN XÉT
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
GVHD
TRẦN QUANG HÀ
1.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.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
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.
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ị
#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)
{
case 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++)
{
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++)
{
printf("\n dinh %d to mau ",i,b[i]);
to(b[i]);
}
printf("\n");
}
void main()
{ clrscr();
docfile();
Tomau();
xuat();
getch();
}
Đỉnh 1 2 3 4 5 6 7 8
Màu 1(Xanh)
Chạy vòng lặp for(i=2;i<=n;i++)
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]++
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)
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
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)
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
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)
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.
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.
[2] www.google.com.vn