1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Toán rời rạc-Chương 7: Đồ thị và cây pps

165 336 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 165
Dung lượng 4,11 MB

Nội dung

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 1

CH 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 3

c 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 5

V 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 13

B 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 33

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.

Trang 37

7.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 38

7.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 39

7.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 42

7.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 49

7.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 51

51

@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 53

chi 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 59

theo 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 63

r 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 72

for ( 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 73

for (i=1; i<=n; i++)

if (chuaxet[i]==0){

solt=solt+1;

BFS(G, n, i, &solt, chuaxet, QUEUE);

} Result(chuaxet, n, solt);

Trang 74

Bà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 81

void 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 91

int 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 92

Ch 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();

}

Ngày đăng: 12/08/2014, 01:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w