Ng đi, chu trình, đ th liên thông

Một phần của tài liệu cơ sở kỷ thuật lập trình (Trang 108)

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 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};

Một phần của tài liệu cơ sở kỷ thuật lập trình (Trang 108)

Tải bản đầy đủ (PDF)

(156 trang)