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 1BÀ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 2BÀ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 3Bac++;
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 4if(a[i][j]>0) Tong++;
printf("\nTong cac dinh:%d",Tong); return Tong;
Trang 5printf("\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 6int 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 7BÀ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 10BÀ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 11int Dem=0, i,j, MLT=0;
for( i = 0; i<n; i++)
DanhDau[i] = 0;
do {
Trang 12} while (ThanhCong == 1);
Trang 13getch();
return 0;
}
Trang 14BÀ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 16FILE*f=fopen("input4.txt","rb"); //input1-input2 fscanf(f,"%d%d%d",&n,&D,&C);
Trang 17BÀ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 18void 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 20BÀ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 23BÀ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 25int D,C,n,Dau,Cuoi;
FILE*f=fopen("input7.txt","rb"); //input1-input2 fscanf(f,"%d%d%d",&n,&D,&C);
Trang 26BÀ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