370 likes | 721 Views
Lý thuyết đồ thị. Những người thực hiện : Nguyễn Lương Hiền-CNTT&TT01 Đinh Hà Ly-CNTT&TT03 Bạch Văn Hải-CNTT&TT01. Lý thuyết đồ thị. Đại cương về đồ thị Đồ thị EULER và đồ thị HAMILTON Giải thuật tìm đường đi. Đại cương về đồ thị. Định nghĩa đồ thị . Các thuật ngữ cơ bản .
E N D
Lýthuyếtđồthị Nhữngngườithựchiện: NguyễnLương Hiền-CNTT&TT01 ĐinhHà Ly-CNTT&TT03 BạchVăn Hải-CNTT&TT01
Lýthuyếtđồthị • Đạicươngvềđồthị • Đồthị EULER vàđồthị HAMILTON • Giảithuậttìmđườngđi
Đạicươngvềđồthị • Địnhnghĩađồthị. • Cácthuậtngữcơbản. • Đườngđi,chutrình,đồthịliênthông • Biễudiễnđồthịtrênmáytính
Địnhnghĩađồthị • Đơnđồthịvôhướng • Đơnđồthịcóhướng • Đađồthịvôhướng • Đađồthịcóhướng
Đơnđồthị & Đađồthịvôhướng • Mộtđađồthịvôhướng la mộtbộ G=<V,E> trongđó: • V#⌀ làtậphợphữuhạngồmcácđỉnhcủađồthị • E làmộthọcáccặpkhôngcóthứtựcủa V goilàcáccạnh • Một đơn đồthị vô hướnglàmộtbộ G=<V,E> trong đó: • V#⌀ làtậphữuhạngồmcácđỉnhcủađồthị • E làtậphợpcáccặpkhôngcóthứtựgồm 2 phầntửkhácnhaucua V gọilàcáccạnh.
Vídụ minh họa Đơnđồthịvôhướng Đađồthịvôhướng a.Đa đồthịvôhướng.vàlàcáccạnh song song Đơnđồthịvôhướng
Đơnđồthị&đađồthịcóhướng • Đađồthịcóhướnglàmộtbộ G=<V,E> trongđó: • V#⌀ làtậphợphữuhạngồmcácđỉnhcủađồthị. • E làmộthọcáccặpcóthứtựcủa V gọilàcáccung. • Đơnđồthịcóhướnglàmộtbộ G=<V,E> trongđó: • V#⌀ làtậphợphữuhạngồmcácđỉnhcủađồthị. • E làtậphợpcáccặpcóthứtựgồm 2 phầntửkhácnhaucủa V gọilàcáccung.
Đơnđồthịcóhướng Đađồthịcóhướng
Cácthuậtngữcơbản Cho đồthịvôhướng G=<V,E> • 2 đỉnhu,vcủađồthịgọilàkềnhaunếu (u,v) là1 cạnhcủađồthị. • Nếu e=(u,v) la 1 cạnhcủađồthịthì ta nóicạnhnàyliênthuộcvới 2 cạnh u vàv.Vàu,vgọilàđỉnhđầucủacạnh e. • Bậccủađỉnh v trongđồthị,kýhiệulàdeg(v) làsốcạnhliênthuộcvớinó.Đỉnhcóbậc 0 đượcgọilàđỉnhcôlập,đỉnhcóbậc 1 dượccoilàđỉnhtreo.
Cácthuậtngữcơbản(tiếp) Cho đồthịvôhướng G=<V,E>: • Tổngsốbậccủacácđỉnhtrongđồthịbằng 2 lầnsốcạnhcủanó: ∑deg(v) =2|E| • Bánbậcracủađỉnh v củađồthị,kýhiệulà(v) làsốcạnhđirakhỏi v. • Bánbậcvàocủađỉnh v củađồthị,kýhiệulàlàsốcạnhđivào v. • Tổngsốbánbậcracủacácđỉnhbằngtổngsốbánbậcvàocủacácđỉnhvàbằngsốcạnhcủađồthị: ∑(v)=∑(v)=|E|
Đườngđi,chutrìnhvàđồthịliênthông • Cho đồthị G=<V,E> đườngđiđộdài n từđỉnh u đếmđỉnh v(n nguyêndương) làdãy :, • Trongđó u=v=với()€E; i=1,2,3….,n-1. • Hoặc (,)(,)……(,). • Nếu u trùng v thìgọi la 1 chutrình. • Đường đi hay chu trìnhtrên G đượcgọilàđơnnếunhư không cócạnhnàobịlặplại trên đường đi. • Đường đi hay chu trình trên G đượcgọilà sơ cấpnếu như không cóđỉnhnàobịlặplại trên đường đi.
Đồthịliênthông • Đồthị vô hướng G =<V,E> đượcgọilà liên thông nếu luôn tìmđượcđường đi giữa hai đỉnhbấtkỳcủanó. • Cho đồthị G =(V,E). ĐồthịH=<W,F> đượcgọilàđồthịconcủaG nếuvàchỉnếu W ≤V và F ≤ E.Đồthị con H đượcgọilà 1 thànhphầnliênthôngcủa G
Đồthịliênthông Cho đồthịcóhướng G=<V,E> • G đượcgọilàliênthôngmạnhnếuluôntìmđượcđườngđinếuluôntìmđượcđườngđigiữa 2 cạnhbấtkìcủanó • G đượcgọilàliênthôngyếunếuđồthịvôhướngtươngứngvớinólàđồthịvôhướngliênthông.
Biểudiễnđồthịtrên MT • Biểu diễnđồthịbằng ma trậnkề. Cho đt G=<V,E> ,V={},mtkề A. = Ma trậnkềcủađồthịcóhướngluônđốixứng • Biểudiễnbằng ma trậnliênthuộcđỉnh-cạnh G=<V,E> đồthịvôhướng , trongđó V={},E={}
Biểudiễnđồthịtrênmáytính • G=<V,E> làđơnđồthịcóhướng , V={},E={ Ma trậnliênthuộcđỉnhcạnh: =
Ma trậnkề • Ma trận A 1 2 3 4 5 6 1 0 1 0 1 1 0 2 1 0 1 1 1 1 3 0 1 0 0 0 0 4 1 1 0 0 1 0 5 1 1 0 1 0 0 6 0 0 0 0 0 0 2 1 3 5 4 6
Đồthịeulervàhamilton • Đồthịeuler Cho G=<V,E>,chutrìnhđơntrong G đi qua tấtcảcáccạnhcủa no đượcgọilàchutrìnheuler.Đườngđiđơnđi qua tấtcảcáccạnhcủaG đượcgọilàđườngđieuler. Địnhlý:đồthịvôhướngliênthông G làđồthịeulerkhivàchỉkhimọiđỉnhcủa G đềucóbậcchẵn.
Đồthịeulervàhamilton • Đồthịhamilton Cho đồthị G=<V,E>,chutrìnhsơcấptrong G đi qua tấtcảcácđỉnhcủanóđượcgọilàchutrìnhhamilton,đườngđisơcấpđi qua tấtcảcácđỉnhcủa G đượcgọilàđườngđihamilton. Địnhlý (dirak,1952) Nếuđồthịvôhướng G với n đỉnh(n>2),mỗibậckhôngnhỏhơn n/2 thì G làđồthịhamilton Địnhlý :Nếu G làđồthịcóhướngliênthôngmạnhvới n đỉnh.Cácđỉnhcó BBR và BBV khôngnhỏhơn n/2 thì G làđồthịhamilton
Đâylàmộtđồthịeulervìcóchứachutrìnheuler : 1 2 3 5 4 3 1 Vàcũnglàđồthịnửaeulervìcũngchứa 1 đườngđieuler
Đồthịhamilton • Đâylà 1 đồthịhamiltonvàcũnglà 1 nửađồthịhamilton.
Bàitoánđườngđingắnnhất • Đồ thịcótrọngsốlàđồthịmàmỗicạnhcủađồthịđượcgánthêmbởi 1 sốthựcthểhiện chi phíphảitốn (…)khiđi qua cungđó • Ma trậnkềtrọngsố A có=trọngsố() nếuchúngthuộc E vangượclạibằng∞ • Cho G làmộtđồthịcótrọngsốvà P là 1 đườngđitrênG.Tađịnhnghĩađộdàicủađườngđi P làtổngtrọngsốcáccạnhtrên P
Bàitoántìmđườngđingắnnhấttrênđồthị :tìmđườngđicóđộdàinhỏnhấttừđỉnh s thuộc V đếnđỉnh t thuộc V. • Đườngđingắnnhấtxuấtpháttừ 1 đỉnh • Nhậnxét: nếu v làđỉnhtrunggiantrêndườngđingắnnhấttừ s đến v thìđườngđitừ s đến v phảilàngắnnhấtvàtừ v đến t cũngphảingắnnhất.
Ý tưởng: • Dòtìmbằngcáchthử qua cácđỉnhtrunggian • Nếupháthiệnđườngđimớingắnhơnthìcậpnhậtđườngđimớivàchỉnhsửacácthông tin. • Sửdụng 2 mảnglưutrữ: Mảng d[v]:độdàiđườngđingắnnhấttừ s tới v Mảng t[v]:lưutrữđỉnhnằmtrước v trênđườngđingắnnhấthiệntại. t[v] s ….. d[v] v …… d[u] u a[u,v]
Thuậttoán Ford-Bellman • (*Khởitạo*) • for v do • Begin d[v]:=c[s,v]; • Truoc[v] := s; • End • (*Bắtđầu*) • d[s]:=0; • for k:=1 to n-2 do • for v do • for udo • if d[v]>d[u]+c[u,v]; • Truoc [v]:=u; • End;
Nhậnxét:thuậttoán ford-bellman ápdụngđượcchomọitrườnghợpnhưngtínhtoánlớn do sửdụng 3 vònglặpthườnglãngphímộtsốbướcsaucùngkhimàkếtquảđãổnđịnh thuậttoánDijkstrasẽgiảiquyếtđiềunày • Ý tưởng: thuậttoánchỉsửdụngchođồthịkhôngcócạnhâmnêntạimỗibướcsẽcó 1 đỉnhmàthông tin vềnókhôngthayđổi
Tạimỗibước ta thựchiện: • Chọn 1 đỉnh u cógiátrị d[u] nhỏnhất. • Chọn u làmbướctrunggianđểthựchiệncácbướctiếptheo
begin • for vdo • begin • d[v]:=c[s,v]; Truoc[v] := s; • end; • d[s]=0; T:=V\{s}; • while (T<>Ø)do • begin • Tìmđỉnh uthỏamãn d[u]=min{d[z]:z}; • T:=T\{u}; • if d[v]>d[u]+c[u,v]; • begin • d[v]:=d[u]+a[u,v]; • Truoc[v]:=u; • end; • end; • end;
Thuậttoán Floyd-WarShall • Đầuvào: Đồthịchobởi ma trậntrọngsố a[i,j] • Đầura: Ma trậnđườngđingắnnhấtgiữacácđỉnh: d[i,j],i,j=1,2,3,…,n, trongđó d[i,j] chođộdàingắnnhấttừiđến j Ma trậnghinhậnđườngđi p[i,j],I,j=1,2,3,….,n, trongđó p[i,j] ghinhậnđỉnhđitrướcđỉnh j trongđoạnđườngngắnnhấttừiđến j
Thuậttoán Floyd-WarShall • begin • for i:=1 to n do • for j:=1 to n do • begin • d[i,j]:=a[i,j]; p[i,j]:=i; • end; • for k:=1 to n do • for i:=1 to n do • for j:=1 to n do • if d[i,j] > d[i,k] + d[k,j] then • begin • d[i,j] = d[i,k] + d[k,j]; • p[i,j] := p[k,j]; • end; • end;
Thuậttoán Johnson • Thuật toán Johnson sử dụng thuật toán Bellman-Ford và thuật toán Dijkstra như những chương trình con. • Nó bao gồm các đỉnh tích luỹ trong danh sách kề. Thuật toán thường dùng |V|*|V| ma trận D = d[i,j], tại d[i,j] = C(i,j) hoặc nó báo về đồ thị nhập vào có chứa chu trình âm. • Như các thuật toán tìm DDNN giữa tất cả các cặp đỉnh khác, ta có các đỉnh được đánh số từ 1 đến |V|.
Code thuậttoán • CONSTfi =’graph.in’; • fo=’graph.out’; • max=100; • VARH : array[1..max+1] of integer; • W : array[1..max+1,1..max+1] of integer; • Nega_weight : integer; • f,g : text; • PROCEDUREINPUT; • BEGIN • { mo file ‘graph.in’,’graph.out’, nhapvao ma trantrong so W,sodinh N, biennega_weighttinh tong caccanh co trong so < 0 } • END; • PROCEDURE NEW_W; • BEGIN • {taodinhmoi N+1, W[N+1,i]=0 va W[i,N+1]=+ voii=1..N} • END;
Code thuậttoán(tiếp) • FUNCTION BELLMAN_FORD;{Tim DDNN tudinh N+1 den cacdinhkhac, luuvaomang H } • BEGIN • {Neu do thi co chutrinh am thi ham Bellman_Ford co gia tri false • neu do thikhongchuachutrinh am thitravemang H} • END; • PROCEDURE DIJKSTRA(U:integer); • BEGIN • { tim DDNN tudinh U den cacdinh con laitheothuattoanDijkstra, gia tri travemang D[u,v] } • END; • PROCEDURE SOLVE; • VAR • BEGIN • NEW_W; • IfBELLMAN_FORD = false • then begin • write(g,’Dothichuachutrinh am’); • exit; • end;
Code thuậttoán(tiếp) • { Tinhlaitrong so caccanh de luon >= 0} • For u:=1 to N+1 do • Forv:=1 to N+1 do W[u,v]:=W[u,v]+H[u]-H[v]; • For u:=1 to N do • Begin • DIJKSTRA(u); • For v:=1 to N do • D[u,v]:=D(u,v)+H[v]-H[u]; • End; • END; • PROCEDURE INPUT_G; • BEGIN • { Ghira file ma tran D, dong file } • END; • BEGIN • OPEN; • SOLVE; • INPUT_G; • END.