Ngo Huu Phuc, Le Quy Don Technical University... Ngo Huu Phuc, Le Quy Don Technical University... Ngo Huu Phuc, Le Quy Don Technical University... Ngo Huu Phuc, Le Quy Don Technical Univ
Trang 1CH NG 7
TH VÀ CÂY
Lecturer: PhD Ngo Huu Phuc
Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@mta.edu.vn
Trang 3c b n nh t c a đ th , ph ng pháp bi u di n đ th trên máy tính và m t s khái ni m liên quan
Trang 4 Lý thuy t đ th đ c đ xu t t th k 18, b t đ u t bài báo
c a Euler công b n m 1736 liên quan đ n l i gi i bài toán n i
Trang 5V y đ th là gì?
Có th đ nh ngh a:
th (Graph) là m t c u trúc d li u r i r c bao g m các đ nh
và các c nh n i các c p đ nh này Chúng ta phân bi t đ th thông qua ki u và s l ng c nh n i gi a các c p đ nh c a đ
th
5
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 8 n đ th vô h ng G =(V,E) là đ th vô h ng mà gi a hai
đ nh ch có t i đa m t c nh
Trang 9 a đ th vô h ng G=(V,E) là đ th vô h ng mà gi a hai
đ nh có th có nhi u h n m t c nh
9
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Ví d v đa đ th vô h ng - M ng máy tính đa kênh tho i
Trang 12 a đ th có h ng G = <V, A> là đ th có h ng, trong đó n u
v1 và v2 là 2 đ nh c a đ th thì có th có nhi u cung (v1,v2) Hai cung e1, e2 t ng ng v i cùng m t c p đ nh đ c g i là cung
l p
Trang 13B ng phân bi t các lo i đ th
13
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 14 Hai đ nh u và v c a đ th vô h ng G =<V, E> đ c g i
là k nhau n u (u,v) là c nh thu c đ th G
N u e =(u, v) là c nh c a đ th G thì ta nói c nh này liên thu c v i hai đ nh u và v, ho c ta nói c nh e n i đ nh u
v i đ nh v, đ ng th i các đ nh u và v s đ c g i là đ nh
đ u c a c nh (u,v)
nh ngh a 7.2.9:
Ta g i b c c a đ nh v trong đ th vô h ng là s c nh liên thu c v i nó và ký hi u là deg(v)
Trang 16 Gi s G = <V, E> là đ th vô h ng v i m c nh Khi đó:
Ch ng minh:
Rõ ràng m i c nh e=(u,v) b t k , đ c tính m t l n trong deg(u)
và m t l n trong deg(v)
T đó suy ra s t ng t t c các b c b ng hai l n s c nh.
Trang 17 Trong đ th vô h ng G=<V, E>, s các đ nh b c l là m t s
Trang 18 N u e=(u,v) là cung c a đ th có h ng G thì ta nói hai đ nh u
và v là k nhau, và nói cung (u, v) n i đ nh u v i đ nh v ho c
c ng nói cung này đi ra kh i đ nh u và đi vào đ nh v nh u (v) s
đ c g i là đ nh đ u (cu i) c a cung (u,v)
nh ngh a 7.2.11:
Ta g i bán b c ra (bán b c vào) c a đ nh v trong đ th có h ng
G là s cung c a đ th đi ra kh i nó (đi vào nó) và ký hi u là deg+(v) và deg-(v)
Trang 19 Cho đ th có h ng:
Ta có:
deg-(a) = 1, deg-(b) = 2, deg-(c) = 2, deg-(d) = 2, deg-(e) = 2
deg+(a) = 3, deg+(b) = 1, deg+(c) = 1, deg+(d) = 2, deg+(e) = 2
19
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 21 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, xntrong đó 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)
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
21
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 22 Tìm các đ ng đi, chu trình trong đ
th vô h ng nh trong hình bên
Trang 23 ng đi đ dài n t đ nh u đ n đ nh v trong đ th có h ng G=<V,A> là dãy:
x0, x1, , xntrong đó, n là s nguyên d ng, u = x0, v = xn, (xi, xi+1) A
ng đi nh trên có th bi u di n thành dãy các cung:
Trang 24 th vô 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ó
nh ngh a 7.3.4:
th H = (W, F) đ c g i là đ th con c a đ th G = (V, E) n u
W V, F E
Trang 27 th đ y đ n đ nh, ký hi u là Kn là m t đ n đ th ch a đúng 1 c nh n i m i c p đ nh phân bi t
27
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Các đ th Kn,
Trang 28 Chu trình Cn, n 3 là m t đ th có n đ nh v1, v2, …, vn và n
c nh (v1, v2), (v2, v3), …, (vn-1, vn), (vn, v1)
Trang 29 Khi thêm 1 đ nh vào chu trình Cn v i n 3 và n i đ nh này
Trang 30 th kh i n chi u (các kh i n chi u) ký hi u là Qn, là các đ th có 2n
đ nh m i đ nh bi u di n b ng xâu nh phân đ dài n Hai đ nh là li n k
n u và ch n u các xâu nh phân bi u di n chúng khác nhau đúng 1 bit
Trang 31 M t đ th đ n G đ c g i là đ th phân đôi n u t p các đ nh V có th phân thành 2 t p con không r ng r i nhau V1 và V2 sao cho m i c nh
Trang 32 th phân đôi đ y đ Km,n là đ th có t p đ nh đ c phân thành hai
t p con t ng ng có m đ nh và n đ nh và có m t c nh gi a hai đ nh khi và ch khi m t đ nh thu c t p con này và đ nh th hai thu c t p con kia
Trang 33di 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.
Trang 377.5.1 Ma tr n k , ma tr n tr ng s (4/6)
Trong m t s bài toán, m i c nh e = (u, v) c a đ th đ c gán
m t giá tr c(e) (ho c vi t c(u,v)) nào đó g i là tr ng s (đ dài)
Trang 387.5.1 Ma tr n k , ma tr n tr ng s (5/6)
Ví d v ma tr n k c a đ th vô h ng có tr ng s :
Trang 397.5.1 Ma tr n k , ma tr n tr ng s (6/6)
M t s nh n xét:
u đi m: 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: ph ng pháp bi u di n này không quan tâm
t i s c nh, luôn m t n2 đ n v b nh đ l u tr đ th
39
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 40 Nh c đi m: đ nh n bi t nh ng c nh nào k v i c nh nào, 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 , c n thêm m đ n v b nh đ l u tr tr ng s c a các
Trang 427.5.2 Danh sách c nh (cung) (3/4)
Ví d 2 v danh sách c nh (cung):
Trang 45 Ví d v danh sách k :
45
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 46 Ví d v danh sách k :
Trang 48 Ví d v ma tr n liên thu c:
Trang 497.6.1 Thu t toán tìm ki m theo chi u sâu trên đ th 7.6.2 Thu t toán tìm ki m theo chi u r ng trên đ th
7.6.3 Tìm các thành ph n liên thông c a đ th
7.6.4 Tìm đ ng đi gi a hai đ nh b t kì c a đ th
7.6.5 Tìm đ ng đi và chu trình Euler
7.6.6 Tìm đ ng đi và chu trình Hamilton
49
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 50Ý t ng:
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 v i
đ nh b t đ u là u
Trang 5151
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 52 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 duy t nh sau:
{
for (i=1; i ≤ n ; i++) chuaxet[i]:= TRUE; /* thi t l p giá
for (i=1; i ≤ n ; i++)
Trang 53chi u sâu trên đ th (4/6)
Ví d v tìm ki m theo chi u sâu:
Trang 54/* Depth First Search */
void Init( int G[][MAX], int *n){
fscanf(fp, "%d" , n);
cout<< "\n So dinh do thi:" <<*n;
cout<< "\n Ma tran ke cua do thi:" ;
for ( int i=1; i<=*n;i++){
cout<< "\n" ; for ( int j=1; j<=*n;j++){
fscanf(fp, "%d" , &G[i][j]); cout<< " " << G[i][j];
Trang 55 Ch ng trình minh h a DFS (ti p)
55
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
void DFS( int G[][MAX], int n,
int v, int chuaxet[]){
cout<< " " <<v;
chuaxet[v]=FALSE;
for ( int u=1; u<=n; u++){
if (G[v][u]==1 && chuaxet[u])
getch();
}
Trang 57 Th c hi n gi i thu t:
ghi nh n tr ng thái duy t các đ nh c a đ th , ta c ng v n s
d ng m ng chuaxet[] g m n ph n t thi t l p giá tr ban đ u là TRUE
N u đ nh i c a đ th đã đ c duy t, giá tr chuaxet[i] s nh n giá
Trang 59theo chi u r ng trên đ th
for (u V )
if (chuaxet[u] ) BFS(u);
}
Trang 60 Ví d v BFS:
Cho đ th vô h ng G = <V,E> sau, duy t đ th theo ph ng pháp BFS
Trang 61 Các b c th c hi n:
61
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
K t qu duy t:
1,2,3,11,4, 6,12,13,7,
8, 9,10, 5
Trang 62/*Breadth First Search */
void Init( int G[][MAX], int *n, int *chuaxet){
fscanf(fp, "%d" , n);
cout<< "\n So dinh do thi:" <<*n;
cout<< "\n Ma tran ke cua do thi:" ;
for (i=1; i<=*n;i++){
cout<<endl;
for (j=1; j<=*n;j++){
fscanf(fp, "%d" , &G[i][j]);
Trang 63r ng trên đ th (8/8)
Ch ng trình minh h a BFS (ti p)
63
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
for (i=1; i<=*n;i++)
chuaxet[i]=0;
}
void BFS( int G[][MAX], int n, int
i, int chuaxet[], int QUEUE[MAX])
} } } }
void main( void ){
int G[MAX][MAX], n, chuaxet[MAX], QUEUE[MAX], i;
Init(G, &n, chuaxet); cout<< "\n\n" ;
for (i=1; i<=n; i++) chuaxet[i]= TRUE;
for (i=1; i<=n; i++)
if (chuaxet[i]) BFS(G, n, i, chuaxet, QUEUE); getch();
}
Trang 64 M t đ th có th liên thông ho c không liên thông
N u đ th liên thông thì s thành ph n liên thông c a nó là 1 i u này
t ng đ ng v i phép duy t theo th t c DFS() ho c BFS() đ c g i
đ n đúng m t l n
N u đ th không liên thông (s thành ph n liên thông l n h n 1) chúng
ta có th tách chúng thành nh ng đ th con liên thông i u này c ng
có ngh a là trong phép duy t đ th , s thành ph n liên thông c a nó
b ng s l n g i t i th t c DFS() ho c BFS()
Trang 65 xác đ nh s các thành ph n liên thông c a đ th , chúng ta s d ng
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[] nh sau:
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
Trang 67 duy t h t t t c các thành ph n liên thông c a đ th , ta ch c n g i
t i th t c lienthong nh d i đây:
void Lien_Thong( void ){
for (i=1; i ≤ n; i++) chuaxet[i] =0;
for (i=1; i<=n; i++)
if (chuaxet[i]==0){
solt=solt+1;
BFS(i);
} }
67
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 68 ghi nh n t ng đ nh c a đ th thu c thành ph n liên thông nào, ta ch
c n duy t các đ nh có cùng chung giá tr trong m ng chuaxet[] nh d i đây:
void Result( int solt){
if (solt==1){
< Do thi la lien thong>;
} for( i=1; i<=solt;i++){
/* a ra thành ph n liên thông th i*/
for( j=1; j<=n;j++){
if( chuaxet[j]==i) < đ a ra đ nh j>;
}
Trang 69 Ví d : cho đ th G = <V, E>, duy t các thành ph n liên thông c a G:
69
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 71/*Breadth First Search */
void Init( int G[][MAX], int *n, int
*solt, int *chuaxet){
fscanf(fp, "%d" , n);
cout<< "\n So dinh do thi:" <<*n;
cout<< "\n Ma tran ke cua do thi:" ;
for (i=1; i<=*n;i++){
cout<<endl;
for (j=1; j<=*n;j++){
fscanf(fp, "%d" , &G[i][j]); cout<< " " <<G[i][j];
} }
Trang 72for ( int i=1; i<=solt;i++){
cout<< "\n Thanh phan lien thong thu: " <<i;
for ( int j=1; j<=n;j++){
if ( chuaxet[j]==i) cout<< " " <<j;
} } }
void BFS( int G[][MAX], int n, int
i, int *solt, int chuaxet[], int
Trang 73for (i=1; i<=n; i++)
if (chuaxet[i]==0){
solt=solt+1;
BFS(G, n, i, &solt, chuaxet, QUEUE);
} Result(chuaxet, n, solt);
Trang 74Bài toán: Cho đ th G=(V, E) Trong đó V là t p đ nh, E là t p c nh c a
đ th Hãy tìm đ ng đi t đ nh s V t i đ nh t V
Phân tích bài toán:
Th t c BFS(s) ho c DFS(s) cho phép duy t các đ nh cùng m t thành
ph n liên thông v i s
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 s đ n t Ng c l i, không t n t i đ ng đi gi a s và t
i u này đ c th c hi n thông qua m ng tr ng thái chuaxet[]
N u chuaxet[t] = False thì có ngh a t cùng thành ph n liên thông v i s
Trang 75 ghi nh n đ ng đi t s đ n t , s d ng m t m ng truoc[] thi t l p giá tr ban đ u là 0
Trong quá trình duy t, thay th giá tr c a truoc[v] đ ghi nh n đ nh đi
DFS(u);
} }
}
75
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 76} }
Trang 77 K t qu đ ng đi đ c đ c ng c l i thông qua th t c Result() nh sau:
void Result( void ){
if (truoc[t]==0){
<Không có đ ng đi t s đ n t>;
return ; }
}
77
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
Trang 78 Tìm đ ng đi t đ nh 1 đ n đ nh 7 b ng thu t toán tìm ki m theo chi u r ng v i đ
th G = <V, E> sau:
Ta có, BFS(1) = 1,2,3,11,4,6,12,13,7,8,9,10,5 Rõ ràng chuaxet[7] = True nên có đ ng
đi t đ nh 1 đ n đ nh 7 Bây gi xác đ nh giá tr trong m ng truoc[] đ có k t qu đ ng đi
Trang 79}
Trang 80} cout<< " " <<s;
Trang 81void main( void ){
cout<< "\n Dinh dau:" ; cin>>s; cout<< "\n Dinh cuoi:" ; cin>>t; Init();
Trang 82 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
Nh n xét:
M i đ th Euler đ u là n a Euler nh ng đi u ng c l i không đúng
Trang 83 Ví d 7.6.5.1:
th G1 là đ th Euler: 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,
Trang 86 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:
N u v là đ nh cô l p thì l y v kh i ng n x p và đ a vào CE;
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
Trang 87 Gi mã tìm chu trình Euler:
87
@Copyrights by Dr Ngo Huu Phuc, Le Quy Don Technical University
void Euler_Cycle( void ){
Trang 88 Ví d :
Cho đ th G = <V, E> trên, tìm chu trình Euler
Trang 91int G[MAX][MAX], n, u=1;
void Init( void ){
cout<< "\n Ma tran ke:" ;
for (i=1; i<=n;i++){
cout<< "\n" ;
for (j=1; j<=n;j++){
fscanf(fp, "%d" , &G[i][j]); cout<< " " <<G[i][j];
} } fclose(fp);
Trang 92Ch ng trình tìm chu trình Euler (ti p):
void Tim( void ){
int v, x, top, dCE;
int stack[MAX], CE[MAX];
else cout<< "\n Khong co chu trinh Euler" ;
getch();
}