nh ngh a 1. ng đi đ dài n t đnh u đ n đnh v trên đ th vô h ng
G=<V,E> là dãy x0, x1, . . ., xn-1, xn trong đó n là s nguyên d ng, x0=u, xn =v, (xi, xi+1)∈E, i =0, 1, 2,. . ., n-1.
ng đi nh trên còn có th bi u di n thành dãy các c nh
(x0, x1), (x1,x2) , . . ., (xn-1, xn).
Ta g i đnh u là đnh đ u, đnh v là đnh cu i c a đ ng đi. ng đi có đnh đ u trùng v i đnh cu i (u=v)đ c g i là chu trình. ng đi hay chu trình đ c g i là đ n n u nh không có c nh nào l p l i.
Ví d 3. Tìm các đ ng đi, chu trình trong đ th vô h ng nh trong hình 5.7. D dàng nh n th y (a, d, c, f, e) là đ ng đi đ n đ dài 4, (d, e, c, a) không là đ ng đi vì (e,c) không ph i là c nh c a đ th . Dãy (b, c, f, e, b) là chu trình đ dài 4. ng đi
(a, b, e, d, a, b) có đ dài 5 không ph i là đ ng đi đ n vì c nh (a,b) có m t hai l n.
a b c
d e f
Hình 5.7. ng đi trên đ th .
Khái ni m đ ng đi và chu trình trên đ th có h ng đ c đnh ngh a hoàn toàn t ng t , ch có đi u khác bi t duy nh t là ta ph i chú ý t i các cung c a đ th .
nh ngh a 3. th vô h ng (có h ng) đ c g i là liên thông n u luôn tìm đ c
đ ng đi gi a hai đnh b t k c a nó.
5.2. BI U DI N TH TRÊN MÁY TÍNH
5.2.1. Ma tr n k , ma tr n tr ng s
l u tr đ th và th c hi n các thu t toán khác nhau, ta c n ph i bi u di n đ th trên máy tính, đ ng th i s d ng nh ng c u trúc d li u thích h p đ mô t đ th . Vi c ch n c u trúc d li u nào đ bi u di n đ th có tác đ ng r t l n đ n hi u qu thu t toán. Vì v y, l a ch n c u trúc d li u thích h p bi u di n đ th s ph thu c vào t ng bài toán c th .
Xét đ n đ th vô h ng G =<V, E>, v i t p đnh V = {1, 2, . . ., n}, t p c nh E = {e1, e2, . . ., em}. Ta g i ma tr n k c a đ th G là ma tr n có các ph n t ho c b ng 0 ho c b ng 1 theo qui đnh nh sau:
A = { aij: aij = 1 n u (i, j) ∈E, aij = 0 n u (i,j) ∉E; i, j =1, 2, . . ., n}. Ví d 1. Bi u di n đ th trong hình 5.8 d i đây b ng ma tr n k . 2 4 1 2 3 4 5 6 1 0 1 1 0 0 0 1 6 2 1 0 1 1 0 0 3 1 1 0 0 1 0 3 5 4 0 1 0 0 1 1 Hình 5.8. th vô h ng G 5 0 0 1 1 0 1 6 0 0 0 1 1 0 Ma tr n k có nh ng tính ch t sau:
a. Ma tr n k c a đ th vô h ng là ma tr n đ i x ng A[i,j] = A[j, i]; i, j = 1, 2, . . . n. Ng c l i, m i (0, 1) ma tr n c p nđ ng c u v i m t đ n đ th vô h ng nđnh; b. T ng các ph n t theo dòng i ( c t j) c a ma tr n k chính b ng b c đnh i (đnh j); c. N u ký hi u n j i ap ij, , =1,2,..., là các ph n t c a ma tr n Ap = A.A. . . A(p l n) khi đó aijp,i, j =1,2,...,n,
cho ta s đ ng đi khác nhau t đnh iđ n đnh j qua p-1đnh trung gian.
Ma tr n k c a đ th có h ng c ng đ c đnh ngh a hoàn toàn t ng t , chúng ta ch c n l u ý t i h ng c a c nh. Ma tr n k c a đ th có h ng là không đ i x ng. Ví d 2. Tìm ma tr n k c a đ th có h ng trong hình 5.9. 1 2 3 4 5 1 2 1 0 1 1 0 0 2 0 0 0 1 1 3 0 0 0 1 0 5 4 0 0 0 0 0 3 4 5 1 0 0 0 0 Hình 5.9. th có h ng G
Trong r t nhi u ng d ng khác nhau c a lý thuy t đ th , m i c nh e =(u,v) c a nó đ c gán b i m t s c(e) = d(u,v) g i là tr ng s c a c nh e. th trong tr ng h p nh v y g i là đ th tr ng s . Trong tr ng h p đó, ma tr n k c a đ th đ c thay b i ma tr n tr ng s c= { c[i,j], i, j= 1, 2, . . ., n. c[i,j] = d(i,j) n u (i, j) ∈E, c[i,j] = θ n u (i, j) ∉E. Trong đó, θ nh n các giá tr : 0, ∞, -∞ tu theo t ng tình hu ng c th c a thu t toán.
Ví d 3. Ma tr n k c a đ th có tr ng s trong hình 5.10. 2 6 4 1 2 3 4 5 6 3 6 8 5 1 0 3 7 0 0 0 1 6 2 3 0 6 6 0 0 7 9 3 7 6 0 0 3 0 3 3 5 4 0 6 0 0 8 5 Hình 5.10. th tr ng s G. 5 0 0 3 8 0 9 6 0 0 0 5 9 0 u đi m c a ph ng pháp bi u di n đ th b ng ma tr n k (ho c ma tr n tr ng s ) là ta d dàng tr l i đ c câu h i: Hai đnh u, v có k nhau trên đ th hay không và chúng ta ch m t đúng m t phép so sánh. Nh c đi m l n nh t c a nó là b t k đ th có bao nhiêu c nh ta đ u m t n2đ n v b nh đ l u tr đ th .
5.2.2. Danh sách c nh (cung )
Trong tr ng h p đ th th a (đ th có s c nh m ≤ 6n), ng i ta th ng bi u di n đ th d i d ng danh sách c nh. Trong phép bi u di n này, chúng ta s l u tr danh sách t t c các c nh (cung) c a đ th vô h ng (có h ng). M i c nh (cung) e(x, y)đ c t ng ng v i hai bi n dau[e], cuoi[e]. Nh v y, đ l u tr đ th , ta c n 2m đ n v b nh . Nh c đi m l n nh t c a ph ng pháp này là đ nh n bi t nh ng c nh nào k v i c nh nào chúng ta c n m phép so sánh trong khi duy t qua t t c m c nh (cung) c a đ th . N u là đ th có tr ng s , ta c n thêm m đ n v b nh đ l u tr tr ng s c a các c nh.
Ví d 4. Danh sách c nh (cung) c a đ th vô h ng, đ th có h ng, đ th tr ng s : Dau Cuoi Dau Cuoi Dau Cuoi Trongso
1 2 1 2 1 2 3 1 3 1 3 1 3 7 2 3 2 4 2 3 6 2 4 2 5 2 4 6 3 5 3 4 3 5 3 4 5 5 1 4 5 8 4 6 4 6 5 5 6 5 6 9
5.2.3. Danh sách k
Trong r t nhi u ng d ng, cách bi u di n đ th d i d ng danh sách k th ng đ c s d ng. Trong bi u di n này, v i m i đnh v c a đ th chúng ta l u tr danh sách các đnh k v i nó mà ta ký hi u là Ke(v), ngh a là
Ke(v) = { u∈ V: (u, v)∈E},
V i cách bi u di n này, m i đnh i c a đ th , ta làm t ng ng v i m t danh sách t t c các đnh k v i nó và đ c ký hi u là List(i). bi u di n List(i), ta có th dùng các ki u d li u ki u t p h p, m ng ho c danh sách liên k t.
Ví d 5. Danh sách k c a đ th vô h ng trong hình 5.8, đ th có h ng trong hình 5.9 đ c bi u di n b ng danh sách k nh sau: List(i) List(i) nh 1 2 3 nh 1 3 2 2 1 3 4 2 4 5 3 1 2 5 3 4 4 2 5 6 5 1 5 3 4 6 6 4 5
5.3. CÁC THU T TOÁN TÌM KI M TRÊN TH
5.3.1 Thu t toán tìm ki m theo chi u sâu
R t nhi u thu t toán trên đ th đ c xây d ng d a trên vi c duy t t t c các đnh c a đ th sao cho m i đnh đ c vi ng th m đúng m t l n. Nh ng thu t toán nh v y đ c g i là thu t toán tìm ki m trên đ th . Chúng ta c ng s làm quen v i hai thu t toán tìm ki m c b n, đó là duy t theo chi u sâu (Depth First Search) và duy t theo chi u r ng (Breath First Search).
T t ng c b n c a thu t toán tìm ki m theo chi u sâu là b t đ u t i m t đnh v0 nào đó, ch n m t đnh u b t k k v i v0 và l y nó làm đnh duy t ti p theo. Cách duy t ti p theo đ c th c hi n t ng t nh đ i v i đnh v0.
ki m tra vi c duy t m i đnh đúng m t l n, chúng ta s d ng m t m ng g m n
ph n t (t ng ng v i n đnh), n u đnh th i đã đ c duy t, ph n t t ng ng trong m ng có giá tr FALSE. Ng c l i, n u đnh ch a đ c duy t, ph n t t ng ng trong m ng có giá tr TRUE. Thu t toán tìm ki m theo chi u sâu b t đ u t đnh v nào đó s duy t t t c các đnh liên thông v i v. Thu t toán có th đ c mô t b ng th t c đ qui DFS()
trong đó: chuaxet - là m ng các giá tr logic đ c thi t l p giá tr TRUE void DFS(int v){
Th m_ nh(v); chuaxet[v] = FALSE; for u ∈ke(v) { if (chuaxet[u] ) DFS( v); } } Th t c DFS() s th m t t c các đnh cùng thành ph n liên thông v i v m i đnh đúng m t l n. đ m b o duy t t t c các đnh c a đ th (có th có nhi u thành ph n liên thông), chúng ta ch c n th c hi n :
for( i=1; i≤n; i++)
chuaxet[i] = TRUE; for( i:=1;i≤ n; i++)
if (chuaxet[i] )
DFS( i);
Chú ý: Thu t toán tìm ki m theo chi u sâu d dàng áp d ng cho đ th có h ng. i v i đ th có h ng, chúng ta ch c n thay các c nh vô h ng b ng các cung c a đ th có h ng.
Ví d 1. Áp d ng thu t toán tìm ki m theo chi u sâu v i đ th trong hình sau:
2 6 8 7 1 4 5 3 10 11 9 12 13 Hình 5.11. th vô h ng G K t qu duy t: 1, 2, 4 , 3, 6, 7, 8, 10, 5, 9, 13, 11, 12
5.3.2. Thu t toán tìm ki m theo chi u r ng (Breadth First Search)
ý r ng, v i thu t toán tìm ki m theo chi u sâu, đnh th m càng mu n s tr thành đnh s m đ c duy t xong. ó là k t qu t t y u vì các đnh th m đ c n p vào stack trong th t c đ qui. Khác v i thu t toán tìm ki m theo chi u sâu, thu t toán tìm ki m theo chi u r ng thay th vi c s d ng stack b ng hàng đ i queue. Trong th t c này, đnh đ c n p vào hàng đ i đ u tiên là v, các đnh k v i v là v1, v2, . . ., vkđ c n p vào queue k ti p. Quá trình đ c th c t ng t v i các đnh trong hàng đ i. Thu t toán d ng khi ta đã duy t h t các đnh k v i đnh trong hàng đ i. Chúng ta có th mô t thu t toán b ng th t c BFS nh d i đây.
chuaxet- m ng ki m tra các đnh đã xét hay ch a;
queue – hàng đ i l u tr các đnh s đ c duy t c a đ th ;
void BFS(int u){
queue = φ;
u <= queue; (*n p u vào hàng đ i*)
chuaxet[u] = false; while (queue ≠φ ){ queue<=p; (* l y p ra t stack*) Th m_ nh(p); for v ∈ ke(p) { if (chuaxet[v] ) {
v<= queue; (*n p v vào hàng đ i*)
chuaxet[v] = false; } } } Th t c BFS s th m t t c các đnh dùng thành ph n liên thông v i u. th m t t c các đnh c a đ th , chúng ta ch c n th c hi n g i t i th t c BFS().
for( u=1; u≤n; u++)
chuaxet[u] = TRUE; for(u=1; u≤n; u++)
if (chuaxet[u])
BFS(u);
Ví d . Áp d ng thu t toán tìm ki m theo chi u r ng v i đ th trong hình 5.11 ta nh n đ c k t qu nh sau:
1, 2, 3, 11, 4, 6, 12, 13, 7, 8, 9, 10, 5;
5.3.3. Ki m tra tính liên thông c a đ th
M t đ th có th liên thông ho c có th không liên thông. N u đ th là liên thông (s thành ph n liên thông là 1), chúng ta ch c n g i t i th t c DFS() ho c BFS() m t l n. N u đ th là không liên thông, khi đó s thành ph n liên thông c a đ th chính b ng s l n g i t i th t c BFS() ho c DFS(). xác đnh s các thành ph n liên thông c a đ th , chúng ta s d ng m t bi n m i solt đ nghi nh n các đnh cùng m t thành ph n liên thông trong m ng chuaxet:
- N u đnh i ch a đ c duy t, chuaxet[i] có giá tr 0;
- N u đnh i đ c duy t thu c thành ph n liên thông th j=solt, ta ghi nh n
chuaxet[i]=solt;
- Các đnh cùng thành ph n liên thông n u chúng có cùng giá tr trong m ng chuaxet. void BFS(int u){
queue= φ;
u <= queue; (*n p u vào hàng đ i*)
solt = solt+1; chuaxet[u] = solt;(*solt là bi n toàn c c thi t l p giá tr 0*) while (queue ≠φ ) {
queue<=p; (* l y p ra t stack*) Th m_ nh(p);
for v ∈ ke(p) {
if (chuaxet[v] ){
v<= queue; (*n p v vào hàng đ i*)
chuaxet[v] = solt; } } } } 5.3.4. Tìm đ ng đi gi a hai đnh b t k c a đ th
Th t c BFS(s) ho c DFS(s) cho phép ta duy t các đnh cùng m t thành ph n liên thông v i đnh s. Nh v y, n u trong s các đnh liên thông v i s ch a t thì ch c ch n có đ ng đi t đnh sđ n đnh t. N u trong s các đnh liên thông v i đnh s không ch a đnh t
thì không t n t i đ ng đi t đnh s đ n đnh t. Do v y, chúng ta ch c n g i t i th t c
DFS(s) ho c BFS(s) và ki m tra xem đnh t có thu c thành ph n liên thông v i s hay không. D i đây là toàn v n ch ng trình tìm đ ng đi gi a hai đnh c a đ th .
#include <stdio.h> #include <conio.h> #include <io.h> #include <stdlib.h> #include <dos.h> #define MAX 100 #define TRUE 1
#define FALSE 0int n, truoc[MAX], chuaxet[MAX], queue[MAX]; int A[MAX][MAX]; int s, t;
/* Breadth First Search */ void Init(void){
FILE *fp; int i, j;
fp=fopen("lienth.IN", "r"); if(fp==NULL){
printf("\n Khong co file input"); delay(2000);return;
}
fscanf(fp,"%d", &n);
printf("\n Ma tran ke cua do thi:"); 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]); } } for(i=1; i<=n;i++){ chuaxet[i]=TRUE; truoc[i]=0; } } void Result(void){ printf("\n\n"); if(truoc[t]==0){
printf("\n Khong co duong di tu %d den %d",s,t); getch();
return;
}
printf("\n Duong di tu %d den %d la:",s,t); int j = t;printf("%d<=", t); while(truoc[j]!=s){ printf("%3d<=",truoc[j]); j=truoc[j]; } printf("%3d",s); } void In(void){ printf("\n\n"); for(int i=1; i<=n; i++)
printf("%3d", truoc[i]); }
void BFS(int s) {
int dauQ, cuoiQ, p, u;printf("\n");
dauQ=1;cuoiQ=1; queue[dauQ]=s;chuaxet[s]=FALSE; while (dauQ<=cuoiQ){
u=queue[dauQ]; dauQ=dauQ+1; printf("%3d",u);
if(A[u][p] && chuaxet[p]){ cuoiQ=cuoiQ+1;queue[cuoiQ]=p; chuaxet[p]=FALSE;truoc[p]=u; } } } } void duongdi(void){
int chuaxet[MAX], truoc[MAX], queue[MAX]; Init();BFS(s);Result();
}
void main(void){ clrscr();
printf("\n Dinh dau:"); scanf("%d",&s); printf("\n Dinh cuoi:"); scanf("%d",&t); Init();printf("\n");BFS(s);
n();getch(); Result();getch(); }
5.4. NG I VÀ CHU TRÌNH EULER
Chu trình đ n trong đ th Gđi qua m i c nh c a đ th đúng m t l n đ c g i là chu trình Euler. ng đi đ n trong G đi qua m i c nh c a nó đúng m t l n đ c g i là đ ng đi Euler. th đ c g i là đ th Euler n u nó có chu trình Euler. th có đ ng đi Euler đ c g i là n a Euler.
Rõ ràng, m i đ th Euler đ u là n a Euler nh ng đi u ng c l i không đúng.
Ví d 1. Xét các đ th G1, G2, G3 trong hình 5.12. a b a b a b e e d c d c c d e G1 G2 G3 Hình 5.12. th vô h ng G1, G2, G3.
th G1 là đ th Euler vì nó có chu trình Euler a, e, c, d, e, b, a. th G3 không có chu trình Euler nh ng ch a đ ng đi Euler a, c, d, e, b, d, a, b vì th G3 là n a Euler. G2 không có chu trình Euler c ng nh đ ng đi Euler.
nh lý. th vô h ng liên thông G=<V, E> là đ th Euler khi và ch khi m i đnh c a Gđ u có b c ch n. th vô h ng liên thông G=<V, E> là đ th n a Euler khi và ch khi nó không có quá hai đnh b c l .
tìm m t chu trình Euler, ta th c hi n theo thu t toán sau:
̇ T o m t m ng CE đ ghi đ ng đi và m t stack đ x p các đnh ta s xét. X p vào đó m t đnh tu ý u nào đó c a đ th , ngh a là đnh u s đ c xét đ u tiên.
̇ Xét đnh trên cùng c a ng n x p, gi s đnh đó là đnh v; và th c hi n: X N u v là đnh cô l p thì l y v kh i ng n x p và đ a vào CE;
X N u v là liên thông v i đnh x thì x p x vào ng n x p sau đó xoá b c nh (v, x); ̇ Quay l i b c 2 cho t i khi ng n x p r ng thì d ng. K t qu đ ng đi Euler
đ c ch a trong CE theo th t ng c l i.
Th t c Euler_Cycle sau s cho phép ta tìm chu trình Euler. void Euler_Cycle(int u){
Stack=φ; CE=φ;
u=>Stack; { n p u vào stack}; while (Stack≠φ) {
x= top(Stack); { x là ph n t đ u stack } if (ke(x) ≠φ) {
y = nh đ u trong danh sách ke(x); Stack<=y; { n p y vào Stack};