C C ấ ấ u tr u tr ú ú c d c d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị Ma trận kề: - Biểu diễn đồ thị G=(V,E) bằng ma trận kề |V| với N hàng, N cột với các giá trị 0,1 |V|= 0 Nếu không tồn tại cạnh giữa v i v j 1 Nếu tồn tại cạnh giữa v i v j - Đồ thị có thị có trọng số: Giá trị của ma trận kề gồm trọng số của các cạnh C C ấ ấ u tr u tr ú ú c d c d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị Ví dụ: Biểu diễn ma trận kề cho các đồ thị sau 1 2 3 4 5 1 0 1 1 0 0 2 1 0 1 1 0 3 1 1 0 0 1 4 0 1 0 0 1 5 0 0 1 1 0 1 2 3 4 5 1 0 1 1 0 0 2 1 0 0 0 0 3 0 1 0 0 0 4 0 0 1 0 1 5 0 1 0 1 0 C C ấ ấ u tr u tr ú ú c d c d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị Danh sách kề: - Biểu diễn đồ thị G=(V,E) bằng danh sách kề |V| là một mảng 1 chiều có size N, trong đó mỗi đỉnh tương đương 1 danh sách liên kết C C ấ ấ u tr u tr ú ú c d c d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị Bài tập: 1. Biểu diễn danh sách kề cho đồ thị 1 2. Biểu diễn ma trận kề cho đồ thị sau C C ấ ấ u tr u tr ú ú c d c d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị Cài đặt ma trận kề: #define max 100 struct Graph { int n; int a[max][max]; }; Định dạng dữ liệu: Dữ liệu vào ma trận kề được lưu ở file: 1. Dòng đầu tiên: số đỉnh của đồ thị 2. Mỗi dòng chứa n số nguyên ứng với giá trị trong ma trận kề C C ấ ấ u tr u tr ú ú c d c d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị Đọc ma trận kề từ file: void Matranke (Graph &g) { char file[128]; printf(“Tap tin nguon (Dothi.txt)”); gets(file); if (strcmp(file,””)==0) strcpy(file,”Dothi.txt”); FILE *f; f = fopen(file,”rt”); C C ấ ấ u tr u tr ú ú c d c d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị if ( f==NULL) { printf(“Khong mo duoc file”); exit(0); } fscanf(f,”%d”,&g.n); for (int i=0;i<g.n;i++) for (int j =0;j<g.n;j++) fscanf (f,”%d”,&g.a[i][j]); fclose(f); } THU THU Ậ Ậ T TO T TO Á Á N DUY N DUY Ệ Ệ T T Đ Đ Ồ Ồ TH TH Ị Ị T T ổ ổ ng quan ng quan Duyệt hay tìm kiếm trên đồ thị: ghé qua mỗi đỉnh trong đồ thị một cách có hệ thống - Duyệt đồ thị không phụ thuộc vào hướng của cạnh Có 2 cách duyệt đồ thị: - Duyệt theo chiều sâu ( Depth-first) - Duyệt theo chiều rộng (Breadth-first) Duy Duy ệ ệ t theo chi t theo chi ề ề u sâu u sâu Duyệt theo chiều sâu: Mỗi lần duyệt một đỉnh ta duyệt đến tận cùng mỗi nhánh rồi mới chuyển sang duyệt nhánh khác. Ví dụ: A B D H C E G F 1 2 3 4 5 7 6 8 Th ứ t ự duy ệ t: A, B, D, H, E, F, G, C . d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị Bài tập: 1. Biểu diễn danh sách kề cho đồ thị 1 2. Biểu diễn ma trận kề cho đồ thị sau C C ấ ấ u tr u tr ú ú c d c d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị Cài. Đồ thị có thị có trọng số: Giá trị của ma trận kề gồm trọng số của các cạnh C C ấ ấ u tr u tr ú ú c d c d ữ ữ li li ệ ệ u cho đ u cho đ ồ ồ th th ị ị Ví dụ: Biểu diễn ma trận kề cho các đồ thị. quan Duyệt hay tìm kiếm trên đồ thị: ghé qua mỗi đỉnh trong đồ thị một cách có hệ thống - Duyệt đồ thị không phụ thuộc vào hướng của cạnh Có 2 cách duyệt đồ thị: - Duyệt theo chiều sâu (