Tải bản đầy đủ (.doc) (72 trang)

Đường đi trong đồ thị

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.62 MB, 72 trang )

Lời Mở Đầu
Ngày nay, Công nghệ thông tin đà và đang trở
thành một trong những ngành mũi nhọn. Nó không chỉ bó
hẹp trong phạm vi nhà trờng, viện nghiên cứu, các trung tâm
máy tính mà còn đợc ứng dụng rộng rÃi trong tất cả các lĩnh
vực của đời sống xà hội. Có thể nói sự phát triển vợt bậc của
Công nghệ thông tin đà giúp con ngời hoá giải đợc rất nhiều
bài toán phức tạp mà trớc đây đà tốn rất nhiều thời gian, công
sức. Giờ đây nó đà trở nên đơn giản hơn, nhanh chóng hơn
và đạt độ chính xác cao hơn. Điều này đà đánh dấu một bớc
ngoặt trong sự phát triển của tin học nói riêng cũng nh của
khoa học nhân loại nói chung.
Sinh viên CNTT ngày nay phải không ngừng học hỏi,
cập nhật những cái mới và biết ứng dụng những kiến thức đÃ
đợc học vào thực tiễn của cuộc sống. Đợt thực tập cơ sở này
chính là bớc đầu tiên đi sâu vào tìm hiểu trong nhiều lĩnh
vực của công nghệ thông tin, trên cơ sở những kiến thức đÃ
đợc học trong những năm học vừa qua.
Đề tài gồm có 4 phần :
Phần I : Đờng đi trong đồ thị
Phần II : Tìm kiếm thông tin trên Internet
Phần III: Từ diển
Phần IV: Tìm hiểu và khai th¸c c¸c t chän cđa
Internet
Option trong Control Panel cđa Windows
Do thời gian và trình độ có hạn nên chắc chắn cũng
không tránh khỏi những sai lầm, thiếu sót. Kính mong đợc sự
đón nhận, ý kiến đóng góp của các thầy cô và các bạn.


Đề tài thực tập cơ sở


MÃ đề: 065
Chúng tôi xin chân thành cảm ơn Thạc sĩ Vũ Chí Cờng
đà tận tình giúp đỡ nhóm chúng tôi hoàn thành đề tài này!
Nhóm

thực

hiện:

Nhóm

2,

Lớp

46e1_CNTT

Đề tài thực tập cơ sở
MÃ đề: 065
Câu 1: Đờng đi trong đồ thị
1. Kiểm tra tính liên thông.
2. Tìm chu trình Euler.
3. Tìm đờng đi ngắn nhất giữa hai đỉnh trong đơn
đồ thị vô hớng và

có hớng với trọng số âm hoặc dơng.

Yêu cầu: - Nêu bài toán
- Nêu thuật toán
- Ví dụ minh hoạ

- Cài đặt thuật toán trên một ngôn ngữ nào
đó( Pascal, C, )
Câu 2: Tìm kiếm thông tin trên Internet
1. Tìm kiếm cơ sở.
2. Tìm kiếm nâng cao.
Câu 3: Từ điển
Cho tệp văn bản trong đó chứa các từ, các dấu phân
cách từ, dấu cách, dÊu phÈy, dÊu chÊm, dÊu chÊm phÈy, dÊu
chÊm than, dÊu chấm hỏi. Mọi từ bắt đầu bằng chữ cái
A..Z(không phân biệt chữ hoa và chữ thờng).

Nhóm chuyên ngành: Mạng _ Trun th«ng

2


Đề tài thực tập cơ sở
MÃ đề: 065
1. Viết thủ tục đọc các từ trong tệp văn bản và lu trữ
vào mảng các danh sách liên kết:
Type Danhsach=^PhanTu;
PhanTu=Record
Tu:String[15];
Tiep:DanhSach;
End;
Var
TuDien :array[A..A]of DanhSach;
Mỗi danh sách liên kết trong từ điển xếp theo thứ tự tăng và
các từ khoá là khác nhau.
2. Viết thủ tục hiển thị các từ ra màn hình theo thứ tự

tăng.
3. Viết thủ tục bổ sung từ mới bằng cách đọc từ bàn
phím và tìm nó trong từ điển.
- Nếu thấy thì hiển thị thông báo ĐÃ có.
- Nếu không chèn vào vị trí thích hợp
4. Viết Menu để thực hiện các chức năng trên.
Yêu cầu báo cáo:
1. Ngôn ngữ cài đặt: PASCAL, C hoặc C++.
2. Báo cáo:
- Đề bài toán
- Mô tả thuật toán.
- Mô tả các Modul thiết kế bài toán
3. Chơng trình.
Câu 4: Tìm hiểu và khai th¸c c¸c t chän cđa Internet
Option trong Control Panel cđa Windows.

Nhóm chuyên ngành: Mạng _ Truyền thông

3


Đề tài thực tập cơ sở
MÃ đề: 065

Nhóm chuyên ngành: Mạng _ Truyền thông

4


Đề tài thực tập cơ sở

MÃ đề: 065
Phần I
đờng đi trong đồ thị
I. Kiểm tra tính liên thông
1. Tính liên thông của đồ thị vô hớng
Đồ thị vô hớng G = ( V, E) đợ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 đồ thị. Ví dụ:(Hình 1)
Trong đồ thị G dới đây là liên thông vì giữa mọi cặp đỉnh
phân biệt đều có đờng đi.
a

b
c

f

d

g

h

Hình 1.
2. Tính liên thông của đồ thị có hớng
- Đồ thị có hớng G = (V,E ) đợc gọi là liên thông mạnh nếu
luôn tìm đợc đờng đi giữa hai đỉnh bất kỳ của nó. Ví dụ:
(Hình 2 )

Nhóm chuyên ngành: Mạng _ Truyền thông


5


Đề tài thực tập cơ sở
MÃ đề: 065
a

b
c

e

d

Hình
2.
- Đồ thị có hớng G = (V,E ) đợc gọi là liên thông yếu nếu có
đồ thị vô hớng tơng ứng với nó là đồ thị vô hớng liên
thông.
Ví dụ: (Hình 3).
a

b
c

e

d

Hình

3.
3. Ví dụ tìm đờng đi và kiểm tra tính liên thông:
Trong mục này ta xét ứng dụng các thuật toán tìm kiếm
mô tả trong các mục trớc vào việc giải bài toán trên đồ thị sau:
a) Bài toán tìm đờng đi giữa hai đỉnh: Giả sử s và t là hai
đỉnh nào đó của đồ thị. HÃy tìm đờng đi từ s đến t.
Nh trên đà phân tích, thủ tục DFS(s) (thuật toán tìm
kiếm theo chiều sâu) và BFS(s) (thuật toán tìm kiếm theo
chiều rộng) sẽ cho phép thăm tất cả các đỉnh thuộc cùng một
thành phần liên thông với s. V× vËy, sau khi thùc hiƯn xong thđ
tơc, nÕu chuaxet[t] =true, thì điều đó có nghĩa là không có

Nhóm chuyên ngành: Mạng _ Truyền thông

6


Đề tài thực tập cơ sở
MÃ đề: 065
đờng đi từ s tới t, còn nếu chuaxet[t]=flase thì t thuộc cùng
thành phần liên thông với s, hay nói cách khác tồn tại đờng đi
từ s đến t. Trong trờng hợp tồn tại đờng đi, để ghi nhận đờng đi, ta dùng thêm biến truoc[v] để ghi nhận đờng đi trớc
đỉnh v trong đờng đi tìm kiếm từ s đến v. Khi đó đối với
thủ tục DFS(v) cần sửa đổi câu lệnh if trong đó nh sau:
if chuaxet[u] then
begin
Truoc[u]:= v;
DFS(u);
end;
Còn đối với thủ tục BFS(v) cần sửa đổi câu lệnh if trong nó

nh sau:
if chuaxet[u] then
begin
QUEUE <= u; chuaxet[u]:=false;
Truoc[u]:=p;
end;
Đờng đi cần tìm sẽ đợc khôi phục theo quy tắc sau:
T<--- p1:=truoc[t] <--- p2:=truoc[p1]<---...<---s
4. Cài đặt thuật toán
{* Chơng trình tìm đờng đi và kiểm tra tính liên
thông *}
USES
Var

ctr;
a:array[1..20,1..20] of byte;
QUEUE, chuaxet, truoc :array[1..20] of

byte;

Nhóm chuyên ngành: Mạng _ Truyền thông

7


Đề tài thực tập cơ sở
MÃ đề: 065
i,j,n,solt,k,s,t : integer;
stop : boolean;
ch : char;

Procedure

Nhapsolieu;

Begin
Write(‘Cho so dinh cua do thi:’); Readln(n);
Writeln(‘Nhap so lieu ma tran ke:’);
For i:=0 to n do
Begin
For j:=i+1 to n do
Begin
Write(‘a[‘,i,’,’,j,’]=’);
Readln(a[i,j]);
a[i,j]:=a[i,j] ;
end;
a[i,j]:=0; writeln;
end;
End;
Procedure

insolieu;

Begin
Writeln(‘ma tran ke:’);
For i:=0 to n do
Begin
For j:=1 to n do write(a[i,j]:3); writeln;
End;
End;


Nhóm chuyên ngành: Mạng _ Trun th«ng

8


Đề tài thực tập cơ sở
MÃ đề: 065
Procedure

ketqualienthong;

Begin
Insolieu;
If solt = 1 the writeln(‘Do thi la lien thong:’)
Else
Begin
Writeln(‘So thanh phan lien thong cua do
thi la:’,solt);
For i:=1 to solt do
Begin
Writeln(‘thanh phan lien thong thu’,i,’gom cac
dinh:’);
For j:=1 to n do
If chuaxet[j]=i then write(j:3);Writeln;
End;
Write(‘go enter de tiep tuc...#7); readln;
End;
Procedure

BFS(i:Integer);


(*Tìm kiếm theo chiều rộng bắt ®Çu tõ ®Ønh i*)
Var

U, dauQ, cuoiQ:Integer;

Begin
DauQ:=1;cuoiQ:=1;
QUEUE[cuoiQ]:=i;chuaxet[i]:=solt;
While dauQ <= cuoiQ do
Begin
U:=QUEUE[dauQ];dau:=dauQ + 1;

Nhóm chuyên ngành: Mạng _ Truyền thông

9


Đề tài thực tập cơ sở
MÃ đề: 065
For j:=1 to n do
If (a[u,j]=1) and (chuaxet[j]=0)
then
Begin
cuoiQ:=cuoiQ

+

1;QUEUE[cuoiQ]:=j;
chuaxet[j]:=solt;

Truoc[j]:=u;
End;
End;
End;
Proceduree

DFS(v:integer);

(*Tìm kiếm theo chiều sâu bắt ®Çu tõ ®Ønh v*)
Var

U:integer;

Begin
Chuaxet[v]:=solt;
For u:=1 to n do
if (a[v,u]=1) and (chuaxet[u]=0) then
Begin
Truoc[u]:=v;DFS(u);
End;
End;
Procedure

LienThong;

Begin
{ Khëi t¹o sè liƯu}
For j:=1 to n do chuaxet[j]:=0;solt:=0;

Nhóm chuyên ngành: Mạng _ Truyền thông


10


Đề tài thực tập cơ sở
MÃ đề: 065
For i:=1 to n do
If chuaxet[i]=0 then
Begin
Solt:=solt+1;
{BFS(i):} DFS(i);
End;
Ketqualienthong;
End;
Procedure

KetQuaDuongDi;

Begin
If truoc[t]=0 then
Writeln(‘khong co duong di tu,s,den,t)
Else
Begin
Writeln(co

duong

di

tu


,s,den,tla:);
J:=t;
Write(t,<==);
While truoc[j] <> s do
Begin
Write(truoc[j],<==);
J:=truoc[j];
End;
Writeln(s);
End;
Write(go

enter

de

tiep

tuc...#7);readln;

Nhóm chuyên ngành: Mạng _ Truyền th«ng

11


Đề tài thực tập cơ sở
MÃ đề: 065
End;
Procedure


DuongDi;

Begin
Insolieu;
Write(tim duong di tu dinh:’);readln(s);
Write(‘

den dinh:’);readln(t);

For j:=1 to n do {khëi t¹o sè liÖu}
Begin
Truoc[j]:=0;chuaxet[j]:=0;
End;
Solt:=1;BFS(s); {DFS(s);}
Ketquaduongdi;
End;
Procedure

Menu;

Begin
Clrscr;
Writeln (‘ Tim duong di va tinh lien thong ‘);
Writeln (‘ ....................................................’);
Writeln (‘ 1. Nhap so lieu tu ban phim :’);
Writeln (‘ 2. Kiem tra tinh lien thong :’);
Writeln (‘ 3. Tim duong di giua hai dinh :’);
Writeln (‘ 4. Thoat :’);
Writeln (‘ ...................................................:’);

Write (‘ Hay go phim so de chon chuc nang ...#7);
Ch:= readkey;Writeln(ch);
End;
{Chơng trình chính}

Nhóm chuyên ngành: Mạng _ Truyền thông

12


Đề tài thực tập cơ sở
MÃ đề: 065
Begin
Repeat
Menu;
Case ch of
1 : Nhapsolieu;
‘2’ : Lienthong;
‘3’ : Duongdi;
End;
Until (ch=’4’) or (upcase(ch)=’Q’);
End.
5. Giao diện chơng trình:

II. Tìm chu trình Euler
Chu trình là một đờng đi khép kín trong đồ thị nghĩa
là đỉnh xuất phát bằng đỉnh kết thúc.Ví dụ: ( Hình 4).

Nhóm chuyên ngành: Mạng _ Truyền thông


13


Đề tài thực tập cơ sở
MÃ đề: 065
b
2

a
1
c
3
12341

d
4

Hình 4.

Nhóm chuyên ngành: Mạng _ Truyền thông

14


Đề tài thực tập cơ sở
MÃ đề: 065

Nhóm chuyên nghành: Mạng_Truyền thông

15



Đề tài thực tập cơ sở
MÃ đề: 065

3. Cài đặt bài toán tìm chu trình Euler
Program

ChutrinhEuler;

Type

Mang = array [ 1..10 ] of Integer;

Var

A: array [1..10, 1..10 ] of Integer;
Dem, i, j, n, sp1, x, sp2, k, l, d:Integer;
Stack, stack1, stack2 : Mang;
Dk : Boolean;

Procedure

NhapDuLieu;

Begin
Write ( ‘ Nhap so dinh cua do thi :’);Readln(n);
For i:=1 to n do
For j:=1 to n do
Begin

Write ( ‘Nhap a[‘,i,j,’]=’);Readln(a[i,j]).
End;
End;
Function
Var

KiemTra:Boolean;
Kt:boolean; dem:integer;

Begin
Kt:=True; dem:=0;
For i:=1 to n do
For j:=1 to n do
Begin
If (a[i,j]) <> (a[j,i]) then kt:=false;
For i:=1 to n do
Begin
For j:=1 to n do
If a[i,j]=1 then dem:=dem+1;

Nhãm chuyên nghành: Mạng_Truyền thông

16


Đề tài thực tập cơ sở
MÃ đề: 065

If dem mod 2 =0 then dem:=0
Else

Kt:=false;

End;
Kiemtra:=kt;
End;
End;
Procedure

KhoiTaoStack( Var sp: Integer; var

stack:mang);
Begin
Sp:=0;
End;
Procedure

Push(Var sp: Integer; Var Stack: Mang; x:

Integer);
Begin
Sp:=sp + 1;
Stack[sp]:= x;
End;
Function

pop(Var sp: Integer; Var Stack :Mang):

Integer;
Begin
If sp <> 0 then

Begin
Pop:=Stack[sp];
Sp:=sp 1;
End;
End;
Procedure

InDuLieu;

Nhóm chuyên nghành: Mạng_Truyền thông

17


Đề tài thực tập cơ sở
MÃ đề: 065
Begin

Writeln( ma tran lien ke cua do thi:’);
For i:=1 to n do
Begin
For j:=1 to n do
Write(a[i,j]:3);writeln;
End;
End;
Procedure

TimChuTrinh;

Begin

KhoiTaoStack(sp1, Stack1);
Write( ‘Nhap dinh xuat phat:’);Readln(d);
Push(sp1, Stack1, d);
Dk:=true;
While dk do
Begin
X:=Stack1[sp1];
For i:=1 to n do
If a[x,1]=1 then
Begin
K:=1;
A[x,k]:=0; a[k,x]:=0;
Push(sp1, Stack1, k);
Break;
End;
Dk:false;
For i:=1 to n do
For j:=1 to n do

Nhãm chuyªn nghành: Mạng_Truyền thông

18


Đề tài thực tập cơ sở
MÃ đề: 065

If a[i,j]=1 then dk:=true;

End;

KhoitaoStack(sp2, Stack2);
While sp1 <> 0 do
Begin
X:=pop(sp1,Stack1);
Push(sp2, Stack2,k);
End;
Writeln( ‘ Chu trinh Euler:’ );
While sp2 <> 0 do
Begin
X:=pop(sp2, Stack2);
Write( x,’==>’);
End;
End;
{............... Chuong trinh chinh.................}
Begin
Nhapdulieu;
Indulieu;
If kiemtra then timchutrinh
Else
Writeln(‘do thi da cho khong co chu trinh
Euler:);Readln;
End.
4. Giao diện chơng trình:

Nhóm chuyên nghành: Mạng_Truyền thông

19


Đề tài thực tập cơ sở

MÃ đề: 065

III. Tìm đờng đi ngắn nhất giữa hai đỉnh trong
đơn đồ thị vô

hớng và có hớng với trọng số dơng

1. Đờng đi ngắn nhất trong đồ thị vô hớng
Cho một đồ thị vô hớng G = (V,E) (V: Tập đỉnh, E: Tập
cạnh)
Và một hµm cã träng sè W: E

R nghÜa lµ víi mäi cung (u,v)

thuéc E cho øng víi mét sè thùc W(u,v) đợc gọi là trọng số.
- Trọng số của đờng đi:
P = ( p1,p2,....,p3).
KÝ hiƯu lµ W(p) lµ tỉng träng sè cđa c¸c cung thc p:
W(p) = W(p1,p2) + W( p2 + p3) + ......+ W(pn -1, pn )
- Mét ®êng đi p từ s đến t đợc gọi là đờng đi ngắn
nhất từ s đến t. Nếu trong các đờng ®i tõ s ®Õn t, p lµ ®êng
®i cã träng số nhỏ nhất. W(p) = min{W(P) với p là đờng đi từ
s đến t}.
Ví dụ:
Trong đó đồ thị bên có đờng đi ngắn nhất từ 1 đến 6
là p =(1, 2, 3, 4, 5, 6) cã träng sè lµ :1 + 2 + 1 + 2 + 2 =8.

Nhãm chuyªn nghành: Mạng_Truyền thông

20



Đề tài thực tập cơ sở
MÃ đề: 065
1

(1
(6 )
(1
)
)

(6
4)

2

(2
5
)

(2
Hình 5. )

3
(6
)

6


2. Đờng đi ngắn nhất trong đồ thị có hớng
Cho ®å thÞ cã híng G = (V,E), | V | = n, | E | = m.
Với các cung đợc gán trọng số, nghĩa là mỗi cung (u, v)
thuộc E của nó đợc đặt tơng ứng với một số thực a(u, v) gọi là
trọng số của nó
Ví dụ:
Trong đồ thị bên có đờng đi ngắn nhất từ 1 đến 6 lµ:
p(1, 2, 4,3,6) cã träng sè lµ : 1 + (7)
2 + 1 + 1=5.

(5)3 (1)

2

(1)
1

(2)

(2) 4

(1)

6
(1)

(4)

(3)


5

3. ThuËt to¸n Dijsktral
(ThuËt toán tìm đờng đi ngắn nhất trên đồ thị trọng
số)
Trong trờng hợp trọng số là các số không âm thì ta sử
dụng thuật toán Dijsktal để tìm đờng đi ngắn nhất từ đỉnh

Nhóm chuyên nghành: Mạng_Truyền thông

21


Đề tài thực tập cơ sở
MÃ đề: 065

s tới đỉnh còn lại của đồ thị bằng thuật toán đợc xây dựng
trên cơ sở gắn cho các đỉnh các nhÃn tạm
thời. NhÃn của mỗi đỉnh cho biết cận trên của độ dài đờng
đi ngắn nhất từ s đến đỉnh đó. Các nhÃn sẽ đợc bíên đổi
theo một thủ tục lỏng mà ở mỗi bớc lỏng có một nhÃn tạm thời
trở thành nhÃn cố định. Nếu nhÃn của một đỉnh nào đó trở
thành cố định của nó sẽ cho ta không phải là cận trên mà là
độ dài của đờng đi ngắn nhất từ đỉnh s đến đỉnh đó.
Thuật toán đợc mô tả nh sau:
Đầu vào: Đồ thị có hớng G = (V, E ) với n đỉnh, số v là
đỉnh xuất phát a[u, v] v là ma trận trọng số.
Giả thiết: a[u, v] >=, Vu,v V.
Đầu ra: Khoảng cách ngắn nhất từ đỉnh s đến đỉnh
còn lại d[v], v € V. Tríc [v],v € V ghi nhËn ®Ønh ®i trớc v trong

đờng đi ngắn nhất từ s đến v.
Begin
( * Khoi Tao *)
For v V do
Begin
D[v]:= a[s,v];
Truoc[v]:=s;
End;
D[s]:=0; T:=V \ {s}; ( T là tập các đỉnh có nhÃn tạm thêi
).
( * Bíc lỈp * )
While T = 0 do

Nhãm chuyên nghành: Mạng_Truyền thông

22


Đề tài thực tập cơ sở
MÃ đề: 065
Begin

Tìm đỉnh u € T tho¶ m·n d[u] = min { d[z]: z T };
T:= T \ {u} ;( Cố định nhÃn của đỉnh u ).
For v T do ( gán nhÃn lại cho các đỉnh T ).
If d[v] > d[u] + a[u,v] then
Begin
D[v]:=d[u] + a[u,v];
Trớc[v]:=u;
End;

End;
End;
4. Cài đặt thuật toán
uses

crt;

Const
Max=50;
Var

n, s, t: Integer;
ch: char;
truoc: array[1..max] of byte;
d: array[1..max] of integer;
a: array[1..max, 1..max] of integer;
xet:array[1..max] of boolean;

Procedure

NhapSoLieu;

Var
f:text;
fname:String;
i,j:integer;
Begin

Nhóm chuyên nghành: Mạng_Truyền thông


23


Đề tài thực tập cơ sở
MÃ đề: 065
Write(



vao

ten

file

du

lieu

can

doc:);Readln(fname);
Assign(f,fname);
Readln(f,n);
For i:= 1 to n do
For j:= 1 to n do
Read(f,a[i,j]);
Close(f);
End;
Procedure


Insolieu;

Var
i,j:integer;
Begin
Writeln( ‘ so dinh cua do thi:’,n);
Writeln( ‘ ma tran khoang cach:’);
For i:=0 to n do
Begin
Write (a[i,j]:3,’ ’);Writeln;
End;
End;
Procedure
Var

Inketqua;
i,j : integer;

Begin
Writeln(‘ duong di ngan nhat la,s,den,t);
Writeln (t,<=);
i:=truoc[t];
while i <> s do
Begin

Nhóm chuyên nghành: Mạng_Truyền th«ng

24



Đề tài thực tập cơ sở
MÃ đề: 065

Write(i,<=);
i:= truoc[i];

End;
Writeln(s);
Writeln (Do dai cua duong di la:’,d[t]);
End;
Procedure
Var

Dijkstra;
v,u,minp:integer;

Begin
Write (‘Tin duong di tu s=’); readln(s);
Write (‘den t=’); readln(t);
For v:=1 to n do
Begin
(*khoi tao nhan*)
D[v]:=a[s,v];
Truoc[v]:=s;
Xet[v]:=false;
End;
Truoc[s]:=0; d[s]:=0;
Xet[v]:=true;
While not xet[t] do

(*****buoclap*****)
Begin
{tim u la dinh co nhan tam thoi nho
nhat}
Minp:=maxint;
For v:=1 to n do
If (not xet[v] and (minp>d[v])) then

Nhóm chuyên nghành: Mạng_Truyền thông

25


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×