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