Bài giảng Lý thuyết về đồ thị - Bài 6: Biểu diễn đồ thị trên máy tính

Tại sao phải biểu diễn đồ thị trên máy tính???

Lý thuyết đồ thị ngày càng được ứng dụng rộng rãi.

Để xây dựng được các ứng dụng của đồ thị trên máy tính thì cần phải tìm cách biểu diễn đồ thị trên máy tính thích hợp.

Máy tính không thể hiểu được các đồ thị dưới dạng hình vẽ thông thường.

Tiêu chuẩn để lựa chọn cách thức biểu diễn đồ thị trên máy tính?

Cấu trúc dữ liệu phải đơn giản, phù hợp với từng bài toán ứng dụng.

Dễ biểu diễn, dễ cài đặt các ứng dụng trên đó.

ppt 31 trang phuongnguyen 4440
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lý thuyết về đồ thị - Bài 6: Biểu diễn đồ thị trên máy tính", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lý thuyết về đồ thị - Bài 6: Biểu diễn đồ thị trên máy tính

Bài giảng Lý thuyết về đồ thị - Bài 6: Biểu diễn đồ thị trên máy tính
Bài 6 
Biểu diễn đồ thị trên máy tính 
6 .1. Các phương pháp biểu diễn đồ thị trên máy tính 
Biểu diễn đồ thị trên máy tính??? 
Tại sao phải biểu diễn đồ thị trên máy tính??? 
Lý thuyết đồ thị ngày càng được ứng dụng rộng rãi. 
Để xây dựng được các ứng dụng của đồ thị trên máy tính thì cần phải tìm cách biểu diễn đồ thị trên máy tính thích hợp. 
Máy tính không thể hiểu được các đồ thị dưới dạng hình vẽ thông thường. 
Tiêu chuẩn để lựa chọn cách thức biểu diễn đồ thị trên máy tính? 
Cấu trúc dữ liệu phải đơn giản, phù hợp với từng bài toán ứng dụng. 
Dễ biểu diễn, dễ cài đặt các ứng dụng trên đó. 
3 
Ma trận kề 
Cho đồ thị G = , với V = {v 1 , v 2 , , v n }. Ma trận kề biểu diễn G là một ma trận vuông A, kích thước nxn, được xác định như sau: 
VD: 
4 
Ma trận kề (tt) 
VD: 
5 
1 
2 
3 
4 
5 
6 
Ma trận kề (tt) 
Đặc điểm của ma trận kề: 
Ma trận vuông, các phần tử chỉ mang giá trị 0 hoặc 1. 
Ma trận kề của đồ thị vô hướng là ma trận đối xứng 
Xác định bậc dựa vào ma trận kề: 
Đối với đồ thị vô hướng: số lượng các phần tử khác 0 trên một dòng (cột) chính là bậc của đỉnh tương ứng với dòng (cột) đó. 
Đối với đồ thị có hướng: 
Số lượng các phần tử khác 0 trên dòng chính là bán bậc ra của đỉnh tương ứng với dòng đó. 
Số lượng các phần tử khác 0 trên cột chính là bán bậc vào của đỉnh tương ứng với cột đó. 
6 
Ma trận liên thuộc đỉnh – cạnh 
Cho đồ thị vô hướng G = , với V = {v 1 , v 2 , , v n }, E = {e 1 , e 2 , , e m }. Ma trận liên thuộc đỉnh – cạnh biểu diễn G là một ma trận A, kích thước nxm, được xác định như sau: 
Ví dụ: 
7 
v i là đỉnh đầu của cạnh e j 
v i không là đỉnh đầu của cạnh e j 
Ma trận liên thuộc (tt) 
VD: 
8 
1 
2 
3 
4 
5 
6 
e 1 
e 2 
e 3 
e 4 
e 5 
e 6 
e 7 
Ma trận liên thuộc (tt) 
Cho đồ thị có hướng G = , với V = {v 1 , v 2 , , v n }, E = {e 1 , e 2 , , e m }. Ma trận liên thuộc đỉnh – cạnh biểu diễn G là một ma trận A, kích thước nxm, được xác định như sau: 
Ví dụ: 
9 
v i là đỉnh đầu của cạnh e j 
v i không là đỉnh đầu, đỉnh cuối của cạnh e j 
v i là đỉnh cuối của cạnh e j 
Ma trận liên thuộc (tt) 
Ví dụ: 
10 
e 1 
e 2 
e 3 
e 4 
e 5 
Ma trận liên thuộc (tt) 
Xác định bậc dựa vào ma trận liên thuộc: 
Đối với đồ thị vô hướng: số lượng các phần tử khác 0 trên một dòng chính là bậc của đỉnh tương ứng với dòng đó. 
Đối với đồ thị có hướng: 
Số lượng các phần tử 1 trên dòng chính là bán bậc ra của đỉnh tương ứng với dòng đó. 
Số lượng các phần tử -1 trên dòng chính là bán bậc vào của đỉnh tương ứng với dòng đó. 
11 
Danh sách cạnh 
Cho đồ thị G = có m cạnh. Danh sách cạnh của G sẽ bao gồm hai mảng 1 chiều có kích thước m: 
Mảng Dau sẽ lưu các đỉnh đầu của các cạnh 
Mảng Cuoi sẽ lưu đỉnh cuối của các cạnh 
VD: 
12 
e 1 
e 2 
e 3 
e 4 
e 5 
Dau 
Cuoi 
1 
3 
4 
1 
3 
4 
4 
2 
2 
4 
Danh sách cạnh (tt) 
VD: 
13 
1 
2 
3 
4 
5 
6 
e 1 
e 2 
e 3 
e 4 
e 5 
e 6 
e 7 
Dau 
Cuoi 
1 
2 
2 
3 
1 
4 
1 
5 
4 
2 
4 
5 
2 
5 
Danh sách cạnh (tt) 
Xác định bậc của đỉnh dựa vào danh sách cạnh: 
Đối với đồ thị vô hướng: duyệt qua 2 mảng Dau va Cuoi , số lần xuất hiện của một đỉnh chính là bậc của đỉnh đó. 
Đối với đồ thị có hướng: 
Duyệt qua mảng Dau , số lần xuất hiện của một đỉnh chính là bán bậc ra của đỉnh đó. 
Duyệt qua mảng Cuoi , số lần xuất hiện của một đỉnh chính là bán bậc vào của đỉnh đó. 
14 
Danh sách kề 
Cho đồ thị G = có n đỉnh. Đồ thị G có thể được biểu diễn bằng n danh sách liên kết. Mỗi danh sách liên kết thứ i sẽ biểu diễn các đỉnh kề với đỉnh v i 
VD: 
15 
3 
NULL 
4 
NULL 
4 
NULL 
1 
NULL 
2 
1 
2 
3 
4 
VD: 
Danh sách kề (tt) 
16 
1 
2 
3 
4 
5 
6 
2 
NULL 
1 
NULL 
2 
NULL 
1 
NULL 
2 
1 
2 
3 
4 
1 
NULL 
5 
6 
4 
5 
3 
4 
5 
5 
2 
NULL 
4 
Danh sách kề (tt) 
Xác định bậc của đỉnh dựa vào danh sách kề: 
Đối với đồ thị vô hướng: Số phần tử của mỗi danh sách sẽ là bậc của đỉnh tương ứng 
Đối với đồ thị có hướng: 
Số phần tử của mỗi danh sách sẽ là bán bậc ra của đỉnh tương ứng 
Việc xác định bán bậc vào khó khăn hơn nhiều: phải duyệt qua tất cả các danh sách, số lần xuất hiện của 1 đỉnh trong các danh sách chính là bán bậc vào của đỉnh đó. 
17 
6.2. Sự đẳng cấu của đồ thị 
Đặt vấn đề 
Xét hai đồ thị sau: chúng giống nhau hay khác nhau??? 
19 
1 
2 
3 
4 
1 
2 
3 
4 
1 
2 
3 
4 
1 
2 
3 
4 
(2’) 
(3’) 
(4’) 
(1’) 
Sự đẳng cấu của đồ thị 
Cho 2 đồ thị G = và đồ thị G’ = . Hai đồ thị G và G’ được nói là đẳng cấu (đẳng hình, đồng cấu) với nhau nếu và chỉ nếu tồn tại một song ánh : 
sao cho: 
(Hai đỉnh tạo thành cạnh trong G thì hai ảnh của chúng cũng tạo thành cạnh trong G’, và ngược lại) 
Ký hiệu: 
20 
Sự đẳng cấu của đồ thị (tt) 
21 
VD: 
Sự đẳng cấu của đồ thị (tt) 
Hãy tìm các đồ thị đẳng cấu trong các đồ thị sau: 
22 
(G1) 
(G2) 
(G3) 
(G4) 
(G5) 
(G6) 
(G7) 
Sự đẳng cấu của đồ thị (tt) 
Các đồ thị sau có đẳng cấu không? Tại sao? 
23 
g – B – 2 
f – D – 4 
i – A – 1 
j – E – 5 
h – C - 3 
6.3. Minh họa về biểu diễn đồ thị trên máy tính 
Biểu diễn đồ thị bằng ma trận kề 
Định nghĩa đồ thị: Cấu trúc dữ liệu biểu diễn đồ thị có thể được thiết kế như sau: 
25 
typedef struct DOTHI 
	{ 
	int nV ;	// số đỉnh 
	int nE ;	// số cạnh 
	int type;	 // 0: vô hướng, 1: có hướng 
	int mtke [maxV][maxV];	// ma trận kề 
	}; 
Nhập đồ thị từ file 
Sử dụng file text để lưu thông tin về đồ thị 
Cấu trúc chung của file text như sau: 
26 
0 6 7 
1 2 
2 3 
1 4 
1 5 
2 4 
4 5 
2 5 
1 
2 
3 
4 
5 
6 
Dòng đầu tiên chứa 3 con số thể hiện lần lượt về loại đồ thị, số đỉnh và số cạnh của đồ thị 
Các dòng tiếp theo, mỗi dòng sẽ thể hiện đỉnh đầu và đỉnh cuối của một cạnh. 
DOTHI.INP 
Nhập đồ thị từ file (tt) 
int Nhap_Tu_File(char *filename, DOTHI &g) 
{ 
	FILE *f = fopen(filename,”rt”); 
	if (f == NULL) 
	return 0;	// Lỗi! Không mở được file 
	fscanf(f,”%d %d %d \n”,&g.type, &g.nV, &g.nE); 
	int dd, dc; 
	for (int i=1; i<=g.nV; i++) 
	for (int j=1; j<=nV; j++) 
	g.mtke[i][j] = 0; 
	for (int k=1; k<=g.nE; k++) 
	{ 
	fscanf(f,”%d %d \n”,&dd, &dc); 
	g.mtke[dd][dc] = 1; 
	if (g.type==0) 
	g.mtke[dc][dd] = 1; 
	} 
	fclose(f);	// Dong file 
	return 1; 
} 
27 
Hàm mở tập tin có tên là filename 
Nhập các tham số type, nV, nE 
Khởi đầu, gán toàn bộ MT kề là 0 
Nếu có cạnh thì gán phần tử tương ứng là 1 
Nếu là đồ thị vô hướng thì gán thêm lệnh này 
Xuất đồ thị ra màn hình 
void Xuat_Ra_MH(DOTHI g) 
{ 
	cout<<“Cac thong tin ve do thi: “<<endl; 
	if (g.type==1) 
	cout<<“ - Day la do thi co huong. “; 
	else 
	cout<<“ - Day la do thi vo huong. “; 
	cout<<“Do thi co “<<g.nV<<“ dinh va co “<<g.nE<<“ canh.”<<endl; 
	cout<<“ - Ma tran ke cua do thi la: “<<endl; 
	for (int i=1; i<=g.nV; i++) 
	{ 
	for (int j=1; j<=g.nV; j++) 
	 	cout<<g.mtke[i][j]<<“ “; 
	cout<<endl; 
	} 
}	 
28 
Xuất đồ thị ra màn hình thực chất là xuất ma trận kề của nó và các thông tin liên quan: loại, số đỉnh, số cạnh. 
Hàm tính bậc của đỉnh 
29 
int bac(DOTHI g, int v) 
{ 
	if (g.type==1) 
	return -1;	// Khong la do thi vo huong 
	if (v g.nV) 
	return -1;	// Dinh khong hop le 
	int bac = 0; 
	for (int i=1; i<=g.nV; i++) 
	if (g.mtke[v][i]==1) 
	bac ++; 
	return bac; 
}	 
Hàm tính bán bậc ra (vào) của đỉnh 
30 
int bac_ra(DOTHI g, int v) 
{ 
	if (g.type==0) 
	return -1;	 
	if (v g.nV) 
	return -1;	 
	int bac = 0; 
	for (int i=1; i<=g.nV; i++) 
	if (g.mtke[v][i]==1) 
	bac ++; 
	return bac; 
}	 
int bac_vao(DOTHI g, int v) 
{ 
	if (g.type==0) 
	return -1;	 
	if (v g.nV) 
	return -1;	 
	int bac = 0; 
	for (int i=1; i<=g.nV; i++) 
	if (g.mtke[i][v]==1) 
	bac ++; 
	return bac; 
}	 
Chương trình 
31 
#include  
#define filename “D:\\DOTHI.INP” 
// Khai báo đồ thị 
// Hàm Nhap_Tu_File  
// Hàm Xuat_ra_MH  
void main() 
{ 
	DOTHI g; 
	if ( ! Nhap_Tu_File(filename, g)) 
	cout<<“ Khong mo duoc file!!!”<<endl; 
	else 
	Xuat_Ra_MH(g); 
	getch(); 
} 

File đính kèm:

  • pptbai_giang_ly_thuyet_ve_do_thi_bai_6_bieu_dien_do_thi_tren_ma.ppt