Ví dụ dưới đây sẽ minh họa cho file dothi.in và caykhung.out của đồ thị.

Một phần của tài liệu 19 đề cấu trúc dữ liệu và giải thuật có đáp án cài đặt bằng ngôn ngữ c (Trang 49 - 52)

dothi.out

51 2 2 1 2 2

101 2 1 2

1 3 41 4 6 1 4 6 1 5 8 2 3 7 2 5 5 3 4 3 4 5 1 1 3 3 4 4 5 #include<iostream.h> #include<fstream.h> #include<math.h> #include<conio.h> #include<time.h> #include<string.h> #include<stdio.h>

ifstream datain("C:/cau truc du lieu/dethi/dothi24.in.txt"); ofstream dataout("C:/cau truc du lieu/dethi/ketqua24.out.txt");

/*

Thuat toan Prim tim cay khung nho nhat */

int a[100], b[100], n, m, w[100], x[100]; void DFS(int i, int a[][100], int n) { x[i] = 1;

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

if (x[j] == 0 && a[i][j] == 1) DFS(j, a, n); }

int NhapDL(int & n, int & m) { datain >> n >> m;

for (int i = 1; i <= m; i++) datain >> a[i] >> b[i] >> w[i]; for (int i = 1; i <= m; i++)

for (int j = i + 1; j <= m; j++) if (w[j] < w[i]) { int k; k = w[i]; w[i] = w[j]; w[j] = k; k = a[i]; a[i] = a[j]; a[j] = k; k = b[i]; b[i] = b[j]; b[j] = k; } int aa[100][100];

for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) aa[i][j] = 0;

for (int i = 1; i <= m; i++) { aa[a[i]][b[i]] = 1;

aa[b[i]][a[i]] = 1; }

for (int i = 1; i <= n; i++) x[i] = 0; DFS(1, aa, n);

for (int i = 1; i <= n; i++) if (x[i] == 0) return 0; return 1;

}

void Prim() { int max = 0;

int aa[100], bb[100], dem = 1, x[100]; aa[1] = a[1];

bb[1] = b[1];

if (aa[1] > max) max = aa[1]; if (bb[1] > max) max = bb[1]; long meo = w[1];

x[1] = 1; while (1) {

for (int i = 1; i <= m; i++) if (x[i] == 0) {

int k = 0;

for (int j = 1; j <= dem; j++)

if (aa[j] == a[i] || aa[j] == b[i] || bb[j] == a[i] || bb[j] == b[i]) { k = 1; break; } if (k == 1) { int h1 = 0, h2 = 0;

for (int j = 1; j <= dem; j++)

if (a[i] == aa[j] || a[i] == bb[j]) { h1 = 1;

break; }

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

if (b[i] == aa[j] || b[i] == bb[j]) { h2 = 1; break; } if (h1 == 0 || h2 == 0) { dem++; x[i] = 1; aa[dem] = a[i]; bb[dem] = b[i];

if (max < aa[dem]) max = aa[dem]; if (max < bb[dem]) max = bb[dem]; meo += w[i];

int kk[100];

for (int h = 1; h <= max; h++) kk[h] = 0;

for (int h = 1; h <= dem; h++) { kk[aa[h]] = 1;

}

int min = 0;

for (int h = 1; h <= max; h++) if (kk[h] == 0) {

min = 1; break; }

if (min == 0) {

dataout << meo << endl;

for (int l = 1; l <= dem; l++)

dataout << aa[l] << " " << bb[l] << endl; return; } } break; } } } } main() {

if (NhapDL(n, m) == 0) dataout << 0 << endl; else

Prim(); }

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CĨ ĐÁP ÁN CÀI ĐẶT BẰNGNGƠN NGỮ C - ĐỀ SỐ 25 NGÔN NGỮ C - ĐỀ SỐ 25

Cho đồ thị vơ hướng liên thơng có trọng số G = <V,E> trong file dothi.in được biểu diễn dưới dạng danh sách cạnh theo khuôn dạng sau: được biểu diễn dưới dạng danh sách cạnh theo khn dạng sau:

 Dịng đầu tiên ghi lại số tự nhiên N, M tương ứng với số đỉnh và số cạnh của đồ thị. cạnh của đồ thị.

 M dòng kế tiếp mỗi dòng ghi lại ba số i, j, w tương ứng với đỉnh đầu, đỉnh cuối và trọng số của cạnh tương ứng. đỉnh cuối và trọng số của cạnh tương ứng.

Hãy sử dụng thuật tốn Kruskal, viết chương trình tìm cây khung nhỏ nhất của đồ thị. Cây khung nhỏ nhất tìm được ghi lại trong file caykhung.out của đồ thị. Cây khung nhỏ nhất tìm được ghi lại trong file caykhung.out theo khn dạng:

 Dòng đầu tiên ghi lại độ dài cây khung nhỏ nhất;

 Những dòng kế tiếp, mỗi dòng ghi lại ba số i, j, w tương ứng với đỉnhđầu, đỉnh cuối và trọng số cạnh tương ứng của cây khung. đầu, đỉnh cuối và trọng số cạnh tương ứng của cây khung.

Một phần của tài liệu 19 đề cấu trúc dữ liệu và giải thuật có đáp án cài đặt bằng ngôn ngữ c (Trang 49 - 52)