1. Trang chủ
  2. » Công Nghệ Thông Tin

Code c++ lý thuyết đồ thị

29 10K 82
Tài liệu đã được kiểm tra trùng lặp

Đ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 29
Dung lượng 549,54 KB
File đính kèm Downloads.rar (687 B)

Nội dung

BÀI VIẾT DƯỚI ĐÂY MÌNH SẼ HƯỚNG DẪN CÁC BẠN VỀ CODE C++ ĐỂ GIẢI MỘT SỐ BÀI TOÁN TRONG MÔN LÝ THUYẾT ĐỒ THỊ.MÌNH SẼ ĐÍNH KÈM FILE TEST BÀI TOÁN ĐỂ MỌI NGƯỜI KIỂM TRA KẾT QUẢ DỄ DÀNG HƠN, KHI TẢI BỘ TEST VỀ MỌI NGƯỜI GIẢI NÉN RA RỒI LƯU CHUNG VỚI CHƯƠNG TRÌNH CHÍNH .

Trang 1

BÀI VIẾT DƯỚI ĐÂY MÌNH SẼ HƯỚNG DẪN CÁC BẠN VỀ CODE C++ ĐỂ GIẢI MỘT

SỐ BÀI TOÁN TRONG MÔN LÝ THUYẾT ĐỒ THỊ

MÌNH SẼ ĐÍNH KÈM FILE TEST BÀI TOÁN ĐỂ MỌI NGƯỜI KIỂM TRA KẾT QUẢ DỄ DÀNG HƠN, KHI TẢI BỘ TEST VỀ MỌI NGƯỜI GIẢI NÉN RA RỒI LƯU CHUNG VỚI CHƯƠNG TRÌNH CHÍNH

SAU ĐÂY LÀ MỘT SỐ THUẬT TOÁN XUẤT HIỆN TRONG BÀI:

Bài 1: Tìm đỉnh có bậc cao nhất, bậc nhỏ nhẩt Tính tổng bậc của đồ thị Đếm số đỉnh bậc chẵn và bậc lẻ

Bài 2: Kiểm tra tính liên thông của một đồ thị vô hướng

Bài 3: Tìm số thành phần liên thông

Bài 4: Tìm kiếm theo chiều sâu

Bài 5: Tìm đường đi Euler

Bài 6: Bài toán du lịch ( tìm kiếm theo chiều sâu)

Bài 7: Thuật toán DIJKSTRA tìm đường đi ngắn nhất

Bài 8: Tìm cây phủ tối thiểu ( Prim & kruskal)

Trang 2

BÀI TOÁN 1: Viết chương trình tìm bậc cao nhất của đỉnh trong đồ thị với đồ thị vô hướng A[i,j] với A[i,j]=1 nếu có đường đi từ i đến j và ngược lại A[i,j] = 0 nếu không có đường đi từ i đến j

Yêu cầu xử l{: f) Tìm đỉnh có bậc cao nhất g) Tìm bậc nhỏ nhẩt của đỉnh h) Tìm đỉnh có bậc nhỏ nhất i) Tính tổng bậc của đồ thị j) Đếm số đỉnh bậc chẵn và bậc

Trang 3

Bac++;

if(Bac>max1) max1 =Bac;

} printf("\n Bac lon nhat: %d",max1); return max1;

Bac++;

if(Bac<min) min =Bac;

} printf("\n Bac nho nhat: %d",min); return min;

Trang 4

if(a[i][j]>0) Tong++;

printf("\nTong cac dinh:%d",Tong); return Tong;

Trang 5

printf("\n Cac dinh bac chan:");

for(int i=0;i<n;i++)

{

Bac=0;

for(int j=0;j<n;j++) if(a[i][j]>0)

Bac++;

if(Bac%2==0) {

printf("%d, ",i+1);

Tong++;

} }

printf("\nTong So Dinh Bac Chan: %d",Tong); }

void DinhBacLe(int &n)

Bac++;

if(Bac%2==1) {

printf("%d, ",i+1);

Tong++;

} }

printf("\nTong So Dinh Bac Le: %d",Tong); }

Trang 6

int main()

{

int n;

FILE*f=fopen("input1.txt","rb"); fscanf(f,"%d",&n);

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

{

fscanf(f,"%d",&a[i][j]); }

Trang 7

BÀI TOÁN 2 Viết chương trình kiểm tra tính liên thông của một đồ thị vô hướng A[i,j] với A[i,j]=1 nếu có đường đi từ i đến j và ngược lại A[i,j] = 0 nếu

không có đường đi từ i đến j

HƯỚNG DẪN THUẬT TOÁN Ý tưởng: Sử dụng thuật toán loang

Bước 1: Xuất phát từ một đỉnh bất kz của đồ thị Ta đánh dấu đỉnh xuất phát và chuyển sang bước 2

Bước 2: Từ một đỉnh i đã đánh dấu, ta đánh dấu đỉnh j nếu A*i,j+ = 1 và j chưa được đánh dấu và chuyển sang bước 3

Bước 3: Thực hiện bước 2 cho đến khi không còn thực hiện được nữa chuyển sang bước 4

Bước 4: Kiểm tra nếu số đỉnh đánh dấu nhỏ hơn n (hay tồn tại ít nhất một đỉnh chưa được đánh dấu) đồ thị sẽ không liên thông và ngược lại đồ thị liên thông

CHƯƠNG TRÌNH MẪU:

Trang 8

}

while (ThanhCong == 0);return 0;

Trang 10

BÀI TOÁN 3 Viết chương trình đếm số thành phần liên thông của đồ thị vô hướng Anxn với: - A[i,j] = 1 nếu có đường đi từ i đến j - A[i,j] = 0 nếu không có đường đi từ i đến j - A[i,j] = A[j,i]

Trang 11

int Dem=0, i,j, MLT=0;

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

DanhDau[i] = 0;

do {

Trang 12

} while (ThanhCong == 1);

Trang 13

getch();

return 0;

}

Trang 14

BÀI TOÁN 4 Có n thành phố biết rằng đường đi giữa hai các thành phố (nếu có) là đường đi hai chiều Sơ đồ mạng lưới giao thông của n thành phố cho bởi ma trận Anxn trong đó: d A*i,j+ = 1 nếu có đường đi từ thành phố i đến thành phố j

e A[i,j] = 0 nếu không có đường đi từ thành phố i đến thành phố j f A[i,j] = A[j,i] Hãy xác định mọi đường từ thành phố D đến thành phố C (nếu có)

HƯỚNG DẪN THUẬT TOÁN S ử dụng kỹ thuật tìm kiếm theo chiều sâu

HƯỚNG DẪN CÀI ĐẶT S ử dụng kỹ thuật cài đặt tìm kiếm theo phương pháp đệ quy

Trang 15

{

for(int i = 0; i<n; i++)

if( a[L[SoCanh-1]][i]>0 && DanhDau[i] == 0)

{ L[SoCanh] = i;

Trang 16

FILE*f=fopen("input4.txt","rb"); //input1-input2 fscanf(f,"%d%d%d",&n,&D,&C);

Trang 17

BÀI TOÁN 5 Một lưới giao thông hai chiều giữa n địa điểm được cho bởi ma trận A*i,j+ trong đó A*i,j+=1 nếu có đường đi từ i đến j, còn A*i,j+ = 0 trong trường hợp ngược lại Một người đưa thơ cần đi qua tất cả các con đường này để phát thơ, mỗi đường chỉ qua một lần Hãy xác định một lộ trình của người đưa thơ này (có thể tồn tại nhiều lộ trình khác nhau) hay thông báo không tồn tại đường như vậy

HƯỚNG DẪN THUẬT TOÁN Bài toán 5 chính là bài toán tìm đường đi Euler Điều kiện để có đường đi Euler là: - Đồ thị liên thông - Đồ thị có không quá 2 đỉnh bậc

lẻ Nếu có 2 đỉnh bậc lẻ thì đỉnh xuất phát tìm đường đi phải là đỉnh bậc lẻ.Ý

tưởng thuật toán: Sử dụng kỹ thuật xoá cạnh Nghĩa là, khi ta đi qua bất kz cạnh nào ta phải xoá cạnh tương ứng bằng cách gán trọng số đường đi của cạnh mới đi qua bằng 0 Thuật toán kết thúc khi ta đi qua tất cả các cạnh của đồ thị khi đó ma trận trận liên kết của đồ thị bằng 0

Mọi người chú ý đây là giải thuật đệ quy nhé:

Trang 18

void TimKiem(int Canh) {

/*Tìm cho d?n khi c?nh tìm du?c l?n hon s? c?nh c?a d? th? m?i xu?t du?ng di*/ if(Canh > SoCanh && Dem ==0 ) InDuongDi();

else {

for(int i = 0; i<n; i++)

if( a[L[Canh-1]][i]>0 && Dem==0){

Trang 20

BÀI TOÁN 6 Một người khách du lịch muốn đi thăm n thành phố được đánh

số từ 1 đến n, mỗi thành phố người khách chỉ muốn đi qua chúng một lần Mạng lưới giao thông giữa n thành phố là hai chiều và được cho bởi ma trận A[i,j] trong

đó A*i,j+ =1 nếu có đường đi giữa thành phố i và thành phố j, A[i,j] = 0 trong

trường hợp ngược lại Hãy viết chương trình thiết lập cho người khách một lộ trình (có thể tồn tại nhiều lộ trình) hay thông báo không tồn tại lộ trình theo yêu cầu của khách

HƯỚNG DẪN THUẬT TOÁN S ử dụng kỹ thuật tìm kiếm theo chiều sâu

HƯỚNG DẪN CÀI ĐẶT S ử dụng kỹ thuật cài đặt tìm kiếm theo phương pháp đệ quy

Trang 22

{

FILE*f=fopen("input6.txt","rb"); //input1-input2 fscanf(f,"%d%d",&n,&D);

Trang 23

BÀI TOÁN 7 Có n thành phố biết rằng đường đi giữa các thành phố (nếu có)

là đường đi hai chiều Sơ đồ mạng lưới giao thông của n thành phố cho bởi ma trận A*i,j+ trong đó: - A*i,j+ là độ dài đường đi từ thành phố i đến thành phố j - A[i,j] = 0 nếu không có đường đi từ thành phố i đến thành phố j - A[i,j] = A[j,i] - A[i,j] nguyên, không âm Hãy xác định đường đi ngắn nhất từ thành phố D đến thành phố C

HƯỚNG DẪN THUẬT TOÁN S ử dụng thuật toán DIJKSTRA tìm đường đi ngắn nhất

Trang 25

int D,C,n,Dau,Cuoi;

FILE*f=fopen("input7.txt","rb"); //input1-input2 fscanf(f,"%d%d%d",&n,&D,&C);

Trang 26

BÀI TOÁN 8 Một công ty cần thay toàn bộ hệ thống dây điện cho n phòng làm việc Cho biết sơ đồ điện hiện có của n căn phòng này được biều diễn bằng

ma trận A*i,j+ trong đó: - A[i,j]=A[j,i] chính là chiều dài dây điện nối liền giữa hai phòng i và j - A[i,j] = A[j,i] = 0 nếu i không nối liền với j Hãy lập trình tính độ dài cuả dây dẫn cần sử dụng sao cho cả n phòng điều có điện và số lượng này là ít nhất Chú {: đồ thị đã cho là liên thông

HƯỚNG DẪN THUẬT TOÁN : Thuật toán Prim tìm cây phủ tối tiểu Thuật toán Kruskal tìm cây phủ tối tiểu

Ngày đăng: 08/06/2016, 15:48

TỪ KHÓA LIÊN QUAN

w