1

1. Tính liên thông của đồ thị vô hướng Định lý 1. Giữa mọi cặp đỉnh phân biệt của một đồ thị vô hướng liên thông luôn luôn có đường đi đơn. 2. Tính liên thông của đồ thị vô hướng Định nghĩa:Đồ thị liên thông không có bất kỳ chu trình nào được gọi là một cây. một nhóm cây trong đó không có 2 cây nào được nối với nhau được gọi là một rừng. Rừng bao trùm của một đồ thị là rừng và là đồ thị con của đồ thị đó và chứa tất cả các nút của đồ thị; rừng gồm các cây T1, T2,... ,Tm trong đó cây Ti chứa tất cả các nút liên thông với nút gốc của nó trong đồ thị. Nếu rừng bao trùm chỉ gồm một cây thì cây đó được gọi là Cây bao trùm của đồ thị đó. Đỉnh tr Là đỉnh mà khi ta xóa bỏ đỉnh đó khỏi đồ thị (và các cạnh liên thuộc với nó: các cạnh có 1 đỉnh là đỉnh xóa bỏ) sẽ làm tăng số thành phần liên thông của đồ thị. Cạnh cầu Là cạnh mà khi ta xóa bỏ cạnh đó sẽ làm tăng số thành phần liên thông của đồ thị. 3. Duyệt đồ thị theo độ sâu DFS (Depth - first traverse) – Ý tưởng chính - Tư tưởng cơ bản của thuật toán: a. Bắt đầu tại một đỉnh v0 nào đó b. 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. 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. d. Đánh dấu các đỉnh đã đi qua e. Thuật toán dừng khi tất cả các đỉnh đã được duyệt - Đánh dấu các đỉnh đã duyệt f. Sử d ng mảng chuaxet[] gồm n phần tử (tương ứng với n đỉnh) g. Nếu đỉnh thứ i đã được duyệt, phần tử tương ứng trong mảng chuaxet[] có giá trị FALSE. h. 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 DFS  Thủ tục DFS: void DFS( int v){ Thăm_Đỉnh(v); chuaxet[v] := FALSE; for ( u ke(v) ) { if (chuaxet[u] ) DFS(u); }
1

Cấu trúc dữ liệu Sử d ng hàng đợi (queue) Đỉnh được nạp vào hàng đợi đầu tiên là v./* đổi trạng thái của v*/ } } } /* end while*/ }/* end BFS*/ 4. Sử d ng mảng chuaxet[] gồm n phần tử thiết lập giá trị ban đầu là TRUE. /*đưa v vào hàng đợi*/ chuaxet[v] = false. v . .. Các đặc điểm 2 . /* thiết lập giá trị ban đầu cho mảng chuaxet[]*/ for (i=1. i n . /*nạp u vào hàng đợi*/ chuaxet[u] = false. sau đó lại tiếp t c thủ t c trên với đỉnh kề gần với nó nhất. Đường đi Euler trong G là đường đi đơn chứa mọi cạnh của G. . i n . duyệt qua tất cả các đỉnh kề với nó theo chiều rộng. /* duyệt xong đỉnh p*/ for (v  ke(p) ) { /* đưa các đỉnh v kề với p nhưng chưa được xét vào hàng đợi*/ if (chuaxet[v] ) { v<= queue. i++) chuaxet[i] := TRUE. i++) if (chuaxet[i] ) DFS( i). Quá trình duyệt tiếp theo 2 k được bắt đầu từ các đỉnh còn có mặt trong hàng đợi. /*lấy p ra từ khỏi hàng đợi*/ Thăm_Đỉnh(p). v ) được nạp vào queue kế tiếp.2 } Trong chương trình chính for (i=1. các đỉnh kề với v ( v . u <= queue. . 1 void BFS(int u){ queue = . /* đổi trạng thái của u*/ while (queue   ) { /* duyệt tới khi nào hàng đợi rỗng*/ queue<=p. Chu trình Euler Định nghĩa Chu trình đơn chứa tất cả các cạnh của đồ thị được gọi là chu trình Euler. Thuật toán BFS Tư tưởng Bắt đầu từ một đỉnh.

Thuật toán xác định chu trình Euler Thuật toán a. /SetEqual(B. vì vậy ta có thể thêm một số bất kỳ các đỉnh có bậc 0 (đỉnh cô lập) vào đồ thị G thì chu trình Euler của G vẫn không thay đổi. giả sử đỉnh đó là đỉnh v. pop($S. b. Kết quả chu trình Euler được chứa trong CE theo thứ tự ngược lại. nhưng không phải là chu trình Euler). nghĩa là đỉnh u sẽ được xét đầu tiên.b là đường Euler.c.n).a[h][i]--. while(i<j) 3 .i=1. Quay lại bước 2 cho tới khi ngăn xếp rỗng.3 - Chu trình Euler là một đường đi Euler nhưng ngược lại thì chưa chắc đã đúng (ví d trên đồ thị G3 thì a. int &nCT) {Stack S.a. while(i<=n && a[h][i]==0) i++.d. và thực hiện: i.//Ban dau chu trinh chua co phan tu nao while(empty($S)) {h=viewtop(&S).}//Lay dinh co lap ra khoi Stack else {push($S.CT[nCT]=h.j=nCT. int n.e.d.a[i][h]--. ii.i).h). dua h vao chu trinh CT {nCT++. void CTEuler(kmatran a.e.a.int i. Một đa đồ thị không có điểm cô lập có chu trình Euler nếu và chỉ nếu đồ thị là liên thông và mỗi đỉnh của nó đều có bậc chẵn.j. Xếp vào đó một đỉnh tuỳ ý u nào đó của đồ thị.c.//Tim i dau tien de a[h][i]#0 if(i==n+1) //h da la dinh co lap. Chu trình Euler có thể đi qua một đỉnh hai lần (ví d chu trình a.d. 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ét đỉnh trên cùng của ngăn xếp.e. tức là các đỉnh có bậc bằng 0 Chu trình Euler chỉ liên quan đến các cạnh của đồ thị.1). Đối với đồ thị có hướng ta có định lý sau: Định lý .t.a trên đồ thị G1) và có thể không đi qua một số đỉnh nào đó nếu các đỉnh này là các đỉnh cô lập.b. kvecto CT. Một đa đồ thị có hướng không có đỉnh cô lập tồn tại chu trình Euler nếu và chỉ nếu đồ thị là liên thông yếu đồng thời bậc-vào và bậc-ra của mỗi đỉnh là bằng nhau. o day ta chon dinh 1 nCT=0.//Dua dinh bat ky vao Stack. Các điều kiện cần và đủ cho chu trình và đường đi Euler Định lý . Tạo một mảng CE để ghi đường đi và một stack để xếp các đỉnh ta sẽ xét.b.//Dat b=a de khoi phuc lai gia tri sau nay push($S.}//Loai canh (i.h. 5. x).h) khoi do thi } //Dao lai chu trinh cho hop ly hon i=1. Nếu v là đỉnh cô lập thì lấy v khỏi ngăn xếp và đưa vào CE.kmatran B. c.

B. } Procedure DFS-Visit(u) { COLOR[u]:= GRAY /*Bắt đầu xét u*/ for each v of Adj[u] do { if COLOR[v] = WHITE then { 4 .i++.v) /*đẩy đỉnh v vào hàng đợi*/ } COLOR(u)=BLACK } } Return PARENTS 7.} SetEqual(a.r) /*Đẩy đỉnh đầu tiên vào hàng đợi*/ /*Xét các đỉnh*/ While Q <> rỗng do { u = Pop(Q)./*Lấy đỉnh đầu hàng đợi Q ra để xét*/ COLOR(s)=GRAY For each v of Adj(u) { if COLOR(v)=WHITE then { COLOR(v)=GRAY PARENTS(v)=u Push(Q.n).4 {t=CT[i].r) { Var list COLOR(u).CT[j]=t.j--. Thuật toán tìm cây bao trùm theo chièu rộng BFS Procedure BFS(G.PARENTS(u).Queue Q /* Khởi tạo */ For each u of E do { GRAY(u)=WHITE PARENTS(u)=Null } Push(Q. Thuật toán tìm cây bao trùm theo chiều sâu Procedure DFS ( G ){ /*Khởi tao*/ For each đỉnh of E do { COLOR[u] := WHITE PARENTS(u)=Null } /* Tìm kiếm đệ quy*/ For each đỉnh u of E do if if COLOR[u] = WHITE then DFS-Visit (u) Return PARENTS. 6.CT[i]=CT[j].

&x). } } } for (int i=1. if (x) { s[i]++. } getch().i<=n. for (int i=1.j++) printf ("%d ".i<=n. int main() { freopen("matran.&n).5 PARENTS[v] := u DFS-Visit (v) } } COLOR[u]:=BLACK /*Xét xong u*/ } 8.txt".h> #define nm 101 using namespace std.i++) { printf ("%d : ".s[i]).j<=s[i]. int n. for (int j=1. a[i][s[i]]=j. } 5 .i++) { for (int j=1. printf ("\n").x."r". int s[nm]. Chương trình chuyển đổi ma trận kề .danh sách kề #include<iostream> #include<conio.stdin).j++) { scanf ("%d". scanf ("%d". int a[nm][nm].j<=n. return 0.a[i][j]).

  .09:(1.80   .:.

$.: .  #97 39E.

  0 6:0:0 .

/:"99 343 $7#3 .

   6:0:05.

9  3 $ .  57.

   %g2*l 3 5 .

/:"943 35 .

Z0 5    .   147 .

43 $ . 533.F9. 3.E.  ... . $.

:.    1 .(      .09.6:0:0.

.. .43 $ .

80.     .(1.:.09.

.  #97 39E.$..

    <   <  <.

03/0 .

 <.

03/$ .

 2   .. ..3.3.3..E.2..3  .:97K3:07  l 3 :079743 .   :97K3:07 l33.99. :97K3 .... 9 .3.    E..

 .3: 9H393: 39-.3.E..:  l3  9 .: O4E- . 393 . . / 0 .O-.29 3.. / 0 .5.  ":.4 99K..H393.39.4   :.O. 9743904993.97.9.E..O9 6:..298 334 O3:.J/.J/97H3 99K. 93. 9 3.2 3.339   9 .O93 6:.9K.-3  :97K3:07..3.:97K3:07. 3. 39.3g35. ...:97K3:073:.O 3.8F9 5 ./ . 3... 0 .43g358.339.ZY aW^ l3  9 . .O99H229 8-9.  3 .  3..:    %:994E3E.O 2.3O :..O.$2.3 3.3   :.:97K3.E.3  l. 5.O. 9 .-.3 ..   .O-.4/%:07 2.. 9.O-.  %42923  .59K...3 ... 3.K..:97K3:07 %:994E3 .3 . 39K5.. 5 9... 33.    EU aZUZb U[Ua`^KZb .:97K3:07 .97.. 7..5 .:97K3:073:.2989.E.. - .4 O29 39: :34 O. 3..:97K3:07  :97K3:07.3..33.0.9.97H3 9 .2 3-3 3.  :97K3:072 9  3 :073.F9 : 9H3  -  F9 397H3.493g3573 96:. 3:8 .33.94% 39 3%  $9..  . 9.E.5939.4.-. ...3:07 3.H36:.3: 9H393.E. 3.O 3 8.3g35 8 3 O 3...335 .

  . 3 .$096:.

.

../045:. 5:8 $  ..9-.978.:3.

.

.:.4$9.43/3 3% ..9.. 4/.9./3-.

.

:.0945 $  0 3 .3/.4 0 0259 $  .45..((  .:973..39:3.:.

.

:903/0.((  1 3  .%2/.

.

../3.5 /:.:973% 3% %3%(545 $  <.4../.4.

.

.4./3.57.(( .4$9..(( <. 080 5:8 $  .

.

3   4/49 < .4...

.

.:973.4..44543 3% 0      .

G:73$ !74.-.789  # : !#%$ : ":0:0" .  9%(%(%(%(9 $096:. .0/:70$  7  '.  3    <   %:994E39K2.4972904.

94 .

. 470.:41/4 # : % !#%$ : : < !:8 " 7 .

43  . l 3 :9H3.

  .

F9.E. 3 .

 0"73/4 :!45 " .

 F9 .  3 :3 "7.

.. %903   # . # !#%$ . : !:8 " .41/ :   1  # .   # 8 # 470. .

 3.43  ..

 <   # :  < < #09:73!#%$   %:994E39K2.:8: !74.0/:70$   .-.4972904.

9.4 .

 341/4   #:(% !#%$ : : < .. 470.

%K22 6: .

 470.. 3:41/4 11  #:(% 903$ '89 :  #09:73!#%$ <  !74.0/:70$ '89 :    #:(#.

9 :F9: .

.(% 903   .41/:(/4 1  #. 1470..

(: $ '89 .  !#%$.  < <   #:(.

F943: .

((  57391 3  < 09.2085..434  /013032  :833.  3.397K3.(8(( < < < 147 393   57391 / 8(   147 398( 57391 / .:3 2.:/0. <   .:/048970.38E.3 99 7 89/3  8..31 / 3   147 393  147 393   8.089/ 393  39.  709:73  <    .2 3.97...973 /.32(32( 39832( 392.31 /   1    8(  .3   1704503 2.

Sign up to vote on this title
UsefulNot useful