Tải bản đầy đủ (.docx) (177 trang)

Ôn thi cao học phần kỹ thuật lập trình có đáp án

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 (457.74 KB, 177 trang )

1. TÌM KẾT QUẢ THỰC HIỆN CHƯƠNG TRÌNH
2. CHUYỂN ĐỔI CHƯƠNG TRÌNH
1. Hãy cho biết kết quả thực hiện đoạn chương trình dưới đây.
#include <stdio.h>
#include <conio.h>
#define MAX 100
int A[] = {9, 7, 12, 8,}, n=4,X[MAX],dem=0;
void Result(void){
printf("\n Buoc %d:",++dem);
for(int i=0; iif(X[i])
printf("%4d",A[i]);
}
void Funtion(int i){
for (int j=0;j<=1;j++){
X[i]=j;
if(i==n-1) Result();
else Funtion(i+1);
}
}
main(void){
Funtion(0);
getch();
return 0;
}

KQ:
Buoc 1: 0
Buoc 2: 8
Buoc 3: 12
Buoc 4: 12 8


Buoc 5: 7
Buoc 6: 7 8
Buoc 7: 7 12
Buoc 8: 7 12 8
Buoc 9: 9
Buoc 10: 9 8
Buoc 11: 9 12
Buoc 12: 9 12 8
Buoc 13: 9 7
Buoc 14: 9 7 8
Buoc 15: 9 7 12
Buoc 16: 9 7 12 8
Chuyển

1


#include <stdio.h>
#include <conio.h>
#define MAX 100
int A[] = {9, 7, 12, 8,}, n=4,X[MAX],dem=0;
void Result(void){
printf("\n Buoc %d:",++dem);
int i=0;
while(iwhile(X[i]){
printf("%4d",A[i]);
break;
}
i++;

}
}
void Funtion(int i){
int j=0;
while(j<=1){
X[i]=j;
int OK=1;
while(i==n-1){
Result();
OK=0;
break;
}
while(OK){
Funtion(i+1);
break;
}
j++;
}
}
main(void){
Funtion(0);
getch();
return 0;
}

2


#include <stdio.h>
#include <conio.h>

#include <string.h>
#define MAX 100
char S[]="ABCD";
int n=strlen(S),X[MAX],dem=0;
void Result(void){
printf("\n Buoc %d:",++dem);
for(int i=0; iif(X[i])
printf("%4c",S[i]);
}
void Funtion(int i){
for (int j=0;j<=1;j++){
X[i]=j;
if(i==n-1) Result();
else Funtion(i+1);
}
}
main(void){
Funtion(0);
getch();
return 0;
}

KQ
Buoc 1:
Buoc 2: D
Buoc 3: C
Buoc 4: C D
Buoc 5: B
Buoc 6: B D

Buoc 7: B C
Buoc 8: B C D
Buoc 9: A
Buoc 10: A D
Buoc 11: A C
Buoc 12: A C D
Buoc 13: A B
Buoc 14: A B D
Buoc 15: A B C
Buoc 16: A B C D

3


Chuyển
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX 100
char S[]="ABCD";
int n=strlen(S),X[MAX],dem=0;
void Result(void){
printf("\n Buoc %d:",++dem);
int i=0;
while(iwhile(X[i]){
printf("%4c",S[i]);
break;
}
i++;

}
}
void Funtion(int i){
int j=0;
while(j<=1){
X[i]=j;
int OK=1;
while(i==n-1){
Result();
OK=0;
break;
}
while(OK){
Funtion(i+1);
break;
}
j++;
}
}
main(void){
Funtion(0);
getch();
return 0;
}

4


#include <stdio.h>
#include <conio.h>

#define MAX 100
int A[] = {6, 7, 8, 9,12,}, n=5,k=3,X[MAX],dem=0;
void Result(void){
for(int i=1; i<=k; i++)
printf("%3d",A[X[i]-1]);
printf("\n");
}
void Funtion(int i){
for (int j=X[i-1]+1;j<=n-k+i;j++){
X[i]=j;
if(i==k) Result();
else Funtion(i+1);
}
}
main(void){
X[0]=0;
Funtion(1);
getch();
}

6 7 8
6 7 9
6 7 12
6 8 9
6 8 12
6 9 12
7 8 9
7 8 12
7 9 12
8 9 12

Chuyen

5


#include <stdio.h>
#include <conio.h>
#define MAX 100
int A[] = {6, 7, 8, 9,12,}, n=5,k=3,X[MAX],dem=0;
void Result(void){
int i=1;
while(i<=k){
printf("%3d",A[X[i]-1]);
i++;
}
printf("\n");
}
void Funtion(int i){
int j=X[i-1]+1;
while(j<=n-k+i){
X[i]=j;
int OK=1;
while(i==k){
Result();
OK=0;
break;
}
while(OK){
Funtion(i+1);
break;

}
j++;
}
}
main(void){
X[0]=0;
Funtion(1);
getch();
}

6


#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX 100
char S[]="ABCDE";
int n=strlen(S),k=3,X[MAX],dem=0;
void Result(void){
for(int i=1; i<=k; i++)
printf("%3d",S[X[i]-1]);
printf("\n");;
}
void Funtion(int i){
for (int j=X[i-1]+1;j<=n-k+i;j++){
X[i]=j;
if(i==k) Result();
else Funtion(i+1);
}

}
main(void){
X[0]=0;
Funtion(1);
getch();
}

65 66 67
65 66 68
65 66 69
65 67 68
65 67 69
65 68 69
66 67 68
66 67 69
66 68 69
67 68 69

7


Chuyen
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX 100
char S[]="ABCDE";
int n=strlen(S),k=3,X[MAX],dem=0;
void Result(void){
int i=1;

while(i<=k){
printf("%3d",S[X[i]-1]);
i++;
}
printf("\n");
}
void Funtion(int i){
int j=X[i-1]+1;
while(j<=n-k+i){
X[i]=j;
int OK=1;
while(i==k){
Result();
OK=0;
break;
}
while(OK){
Funtion(i+1);
break;
}
j++;
}
}
main(void){
X[0]=0;
Funtion(1);
getch();
}

8



#include <stdio.h>
#include <conio.h>
int A[] = {4, 3, 7, 8, 6, 2, 5,}, n=7, OK=1,dem=0;
void Result(void){
printf("\n Ket qua buoc %d:",++dem);
for(int i=0; i}
int main(void){
for(int i=0; i<=n-2; i++){
if(OK){
if(A[i]int t=A[i];A[i]=A[i+1];A[i+1]=t;
}
} else {
if(A[i]>A[i+1]){
int t=A[i];A[i]=A[i+1];A[i+1]=t;
}
}
Result();OK=!OK;
}
getch();
return(0);
}

Ket qua buoc 1: 4 3 7 8 6 2 5
Ket qua buoc 2: 4 3 7 8 6 2 5
Ket qua buoc 3: 4 3 8 7 6 2 5
Ket qua buoc 4: 4 3 8 6 7 2 5

Ket qua buoc 5: 4 3 8 6 7 2 5
Ket qua buoc 6: 4 3 8 6 7 2 5

9


Chuyen
#include <stdio.h>
#include <conio.h>
int A[] = {4, 3, 7, 8, 6, 2, 5,}, n=7, OK=1,dem=0;
void Result(void){
printf("\n Ket qua buoc %d:",++dem);
int i=0;
while(iprintf("%4d",A[i]);
i++;
}
}
int main(void){
int i=0;
while(i<=n-2){
int OK1=1;
while(OK){
while(A[i]int t=A[i];A[i]=A[i+1];A[i+1]=t;
break;
}
OK1=0;break;
} while(OK1){
while(A[i]>A[i+1]){

int t=A[i];A[i]=A[i+1];A[i+1]=t;
break;
}
break;
}
Result();OK=!OK;
i++;
}
getch();
return(0);
}

10


#include <stdio.h>
#include <conio.h>
int A[] = {4, 3, 7, 8, 6, 2, 5,}, n=7, OK=1,dem=0;
void Result(void){
printf("\n Ket qua buoc %d:",++dem);
for(int i=0; i}
int main(void){
for(int i=0; i<=n-2; i++){
if(OK){
if(A[i]>A[i+1]){
int t=A[i];A[i]=A[i+1];A[i+1]=t;
}
} else {
if(A[i]

int t=A[i];A[i]=A[i+1];A[i+1]=t;
}
}
Result();OK=!OK;
}
getch();
return(0);
}

Ket qua buoc 1: 3 4 7 8 6 2 5
Ket qua buoc 2: 3 7 4 8 6 2 5
Ket qua buoc 3: 3 7 4 8 6 2 5
Ket qua buoc 4: 3 7 4 8 6 2 5
Ket qua buoc 5: 3 7 4 8 2 6 5
Ket qua buoc 6: 3 7 4 8 2 6 5

11


Chuyen
#include <stdio.h>
#include <conio.h>
int A[] = {4, 3, 7, 8, 6, 2, 5,}, n=7, OK=1,dem=0;
void Result(void){
printf("\n Ket qua buoc %d:",++dem);
int i=0;
while(iprintf("%4d",A[i]);
i++;
}

}
int main(void){
int i=0;
while(i<=n-2){
int OK1=1;
while(OK){
while(A[i]>A[i+1]){
int t=A[i];A[i]=A[i+1];A[i+1]=t;
break;
}
OK1=0;break;
} while(OK1){
while(A[i]int t=A[i];A[i]=A[i+1];A[i+1]=t;
break;
}
break;
}
Result();OK=!OK;
i++;
}
getch();
return(0);
}

12


TEST 2
2.1.Cho dãy gồm n số tự nhiên phân biệt a1, a2, .., an và số tự nhiên K. và một ngưỡng giá trị θ.

Hãy viết chương trình liệt kê tất cả các phần tử của tập D được xác định như dưới đây:
n
n


D = ( x1 , x2 ,, xn ) : ∑ ai xi = K , và ∑ ci xi ≥ θ ∈ { 0,1} , i = 1,2,..., n 
i =1
i =1


;
Dữ liệu vào cho bởi file data.in theo khuôn dạng như sau:

• Dòng đầu tiên ghi lại hai số tự nhiên n , K và θ . Hai số được viết cách nhau bởi một vài
khoảng trống.

• N dòng kế tiếp mỗi dòng ghi lại bộ đôi (

ai ci

). Hai số khác nhau được viết cách nhau bởi

một vài kí tự trống.

Kết quả ra ghi lại trong file ketqua.out theo khuôn dạng sau:

• Dòng đầu tiên ghi lại số tự nhiên k là số phần tử của tập D.
• k dòng tiếp theo mỗi dòng ghi lại một vector nhị phân X = (x1, x2 ,.., xn) là phần tử của D.
Hai thành phần khác nhau của vector x được viết cách nhau bởi một vài khoảng trống.


Ví dụ với n =6, K = 20, θ=24 { a1, a2, a3, a4, a5, a6,} = {2, 4, 6, 8, 10, 12 }, { c 1, c2, c3, c4, c5,
c6,} = {10, 8, 2, 4, 12, 6 } trong file data.in sẽ cho ta 2 phần tử của tập D tương ứng với 3 vector
nhị phân độ dài n trong file ketqua.out dưới đây:

Ketqua.Out

Data.in
6
2
4
6
8
10
12

20
10
8
2
4
12
6

24

#include <conio.h>
#include <stdio.h>
#define max 100
int A[max],C[max],X[max],n,k,d,ok=1,count=0;
FILE *fp;

void read_data(void){
fp=fopen("data.in","r");
fscanf(fp,"%d%d%d",&n,&k,&d);
13

2
1
1

0
1

0
1

1
1

1
0

0
0


for(int i=1;i<=n;i++){
fscanf(fp,"%d%d",&A[i],&C[i]);
X[i]=0;
}
fclose(fp);

}
void Result(void){
fprintf(fp,"\n");
for(int i=1;i<=n;i++)
fprintf(fp,"%3d",X[i]);
}
int Test(void){
int s=0,p=0;
for(int i=1;i<=n;i++){
s=s+A[i]*X[i];
p=p+C[i]*X[i];
}
if(s==k&&p>=d) return 1; return 0;
}
void Next_bit_string(void){
int i;
for(i=n;i>0&&X[i];i--)
X[i]=0;
if(i>0) X[i]=1;
else ok=0;
}
int main(void){
read_data();
fp=fopen("ketqua.out","w");
while(ok){
if(Test()){Result();count++;}
Next_bit_string();
}
rewind(fp);
fprintf(fp,"%d\n",count);

fclose(fp);
return 0;
}

14


2.2 Cho ai, ci , K, N (i =1, 2,..,N; N≤100) là những số nguyên dương và tập hợp
N


D =  X = ( x1 , x2 ,.., xN ) : ∑ a j x j = K ; x j = 0,1.
j =1


Hãy viết chương trình tìm phương án tối ưu XOPT =(x1,x2,..,xN) và giá trị tối ưu
FOPT=F(XOPT) của hàm mục tiêu
N

F ( x1 , x 2 ,.., x N ) = ∑ c j x j → max
j =1

; với

X = ( x1 , x 2 ,.., x N ) ∈ D

.

Dữ liệu vào cho bởi file data.in theo khuôn dạng sau:


• Dòng đầu tiên ghi lại số tự nhiên N và K. Hai số được viết cách nhau một vài khoảng
trống;

• N dòng kế tiếp mỗi dòng ghi lại bộ đôi (

ai ci

). Hai số khác nhau được viết cách nhau

bởi một vài kí tự trống.

Giá trị tối ưu FOPT và phương án XOPT tìm được ghi lại trong file ketqua.out theo khuôn
dạng:

• Dòng đầu tiên ghi lại giá trị tối ưu FX(X);
• Dòng kế tiếp ghi lại phương án tối ưu XOPT. Hai phần tử khác nhau của phương án
tối ưu được viết cách nhau bởi một vài khoảng trống.

Ví dụ với sau sẽ minh họa khuôn dạng cho file data.in và ketqua.out của bài toán.

Data.in
6
2
4
6
8
10
12

20

10
8
2
4
12
6

Ketqua.Out
26
1 0

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define max 100
int A[max],C[max],X[max],n,k,FOPT=-3000,XOPT[max];
FILE *fp;
void Read_data(void){
fp=fopen("data.in","r");
fscanf(fp,"%d%d",&n,&k);
for(int i=1;i<=n;i++){
15

0

1

1

0



fscanf(fp,"%d%d",&A[i],&C[i]);
}fclose(fp);
}
void Result(void){
fprintf(fp,"%3d\n",FOPT);
for(int i=1;i<=n;i++)
fprintf(fp,"%3d",XOPT[i]);
}
void Update(void){
int s=0,f=0;
for(int i=1;i<=n;i++){
s=s+A[i]*X[i];
f=f+C[i]*X[i];
}
if(s==k&&f>FOPT){
FOPT=f;
for(int j=1;j<=n;j++)
XOPT[j]=X[j];
}
}
void Try(int i){
for(int j=0;j<=1;j++){
X[i]=j;
if(i==n) Update();
else Try(i+1);
}
}
int main(void){

Read_data();
Try(1);
fp=fopen("ketqua.out","w");
Result();
fclose(fp);
return 0;
}

16


2.3 Cho ai, ci , K, N (i =1, 2,..,N; N≤100) là những số nguyên dương và tập hợp
N


D =  X = ( x1 , x2 ,.., xN ) : ∑ a j x j = K ; x j = 0,1.
j =1


Hãy viết chương trình tìm phương án tối ưu XOPT =(x1,x2,..,xN) và giá trị tối ưu
FOPT=F(XOPT) của hàm mục tiêu
N

F ( x1 , x2 ,.., xN ) = ∑ c j x j → min
j =1

; với

X = ( x1 , x 2 ,.., x N ) ∈ D


.

Dữ liệu vào cho bởi file data.in theo khuôn dạng sau:

• Dòng đầu tiên ghi lại số tự nhiên N và K. Hai số được viết cách nhau một vài khoảng
trống;

• N dòng kế tiếp mỗi dòng ghi lại bộ đôi (

ai ci

). Hai số khác nhau được viết cách nhau

bởi một vài kí tự trống.

Giá trị tối ưu FOPT và phương án XOPT tìm được ghi lại trong file ketqua.out theo khuôn
dạng:

• Dòng đầu tiên ghi lại giá trị tối ưu FX(X);
• Dòng kế tiếp ghi lại phương án tối ưu XOPT. Hai phần tử khác nhau của phương án
tối ưu được viết cách nhau bởi một vài khoảng trống.

Ví dụ với sau sẽ minh họa khuôn dạng cho file data.in và ketqua.out của bài toán.

Data.in
6
2
4
6
8

10
12

20
10
8
2
4
12
6

Ketqua.Out
10
0 0

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define max 100
int A[max],C[max],X[max],n,k,FOPT=3000,XOPT[max];
FILE *fp;
void Read_data(void){
fp=fopen("data.in","r");
fscanf(fp,"%d%d",&n,&k);
for(int i=1;i<=n;i++)
17

0

1


0

1


fscanf(fp,"%d%d",&A[i],&C[i]);
fclose(fp);
}
void Result(void){
fprintf(fp,"%3d\n",FOPT);
for(int i=1;i<=n;i++)
fprintf(fp,"%3d",XOPT[i]);
}
void Update(void){
int S=0,F=0;
for(int i=1;i<=n;i++){
S=S+A[i]*X[i];
F=F+C[i]*X[i];
}
if(S==k&&FFOPT=F;
for(int j=1;j<=n;j++)
XOPT[j]=X[j];
}
}
void Try(int i){
for(int j=0;j<=1;j++){
X[i]=j;
if(i==n) Update();

else Try(i+1);
}
}
int main(void){
Read_data();
fp=fopen("ketqua.out","w");
Try(1);
Result();
fclose(fp);
return 0;
}

18


2.4 Một công ty lữ hành cần xây dựng các tour du lịch đi qua N điểm. Xuất phát tại
thành phố số 1 công ty lữ hành muốn xây dựng các tour có chi phí đúng bằng K,đi qua
tất cả các điểm còn lại, mỗi điểm đúng một lần rồi trở lại điểm ban đầu. Biết chi phí đi lại
từ điểm thứ i đến điểm thứ j là cij.
Dữ liệu vào cho bởi file chiphi.in theo khuôn dạng sau:
• Dòng đầu tiên ghi lại số tự nhiên N , K là số điểm các tour du lịch và chi phí của
tour
• N dòng kế tiếp ghi lại ma trận chi phí C = (cij). Hai phần tử khác nhau của ma
trận C = (cij) được ghi cách nhau bởi một vài khoảng trống.
Hãy viết chương trình liệt kê tất cả các tour du lịch có chi phí đúng bằng K cho công
ty du lịch .Ghi lại các Tour trên mỗi dòng .Hai điểm khác nhau của Tour được viết
cách nhau một khoảng trống .Nếu không thể xây dựng được bất ký Tour nào hãy đưa
ra thông báo “Tour không tồn tại”
Ví dụ về dưới đây sẽ minh họa cho file data.in và ketqua.out của bài toán.
Ketqua.Out


Data.in
5
00
11
09
13
12

52
09
00
11
12
08

08
06
00
09
07

12
10
12
00
14

07
08

11
12
00

#include <conio.h>
#include <stdio.h>
#define max 100
int C[max][max],X[max],n,k,chuaxet[max];
FILE *fp;
void Read_data(void) {
fp=fopen("data.in","r");
fscanf(fp,"%d%d",&n,&k);
for(int i=1; i<=n; i++) {
chuaxet[i]=1;
for(int j=1; j<=n; j++) {
fscanf(fp,"%d",&C[i][j]);
}
}
fclose(fp);
}
void Result(void) {
19

1
1

3
4

4

3

2
2

5
5

1
1

1

5

4

3

2

1


fprintf(fp,"\n");
for(int i=1; i<=n; i++)
fprintf(fp,"%3d",X[i]);
fprintf(fp,"%3d",1);
}
int Test(void) {

int S=0;
for(int i=1; iS=S+C[X[i]][X[i+1]];
}
S=S+C[X[n]][X[1]];
if(S==k) return 1;
return 0;
}
void Try(int i) {
for(int j=2; j<=n; j++) {
if(chuaxet[j]) {
X[i]=j;
chuaxet[j]=0;
if(i==n) {
if(Test()) Result();
} else Try(i+1);
chuaxet[j]=1;
}
}
}
int main(void) {
Read_data();
fp=fopen("ketqua.out","w");
X[1]=1;
chuaxet[1]=0;
Try(2);
if (Test()==0) printf("Tour khong ton tai");
fclose(fp);
return 0;
}


20


TEST 3

Cho đồ thị
G =<V, E>, được biểu diễn dưới dạng danh sách kề và hai đỉnh u∈V, v∈V trong
file dothi.in theo khuôn dạng khác nhau ( ma trận kề, danh sách kề ,danh sách
cạnh):
+ Dòng đầu tiên ghi lại ba số tự nhiên N,u,v (N<= 100 là số đỉnh của đồ thị). Ba số
được viết cách nhau bởi khoảng trống
+ N dòng kế tiếp mỗi dong ghi lại danh sách kề của đỉnh tương ứng , hai đỉnh khác
nhau của mỗi danh sách được viết cách nhau 1 khoảng trống. Đinh có danh sách kề
là θ được ghi lại giá tri 0.
1.

Hãy sử dụng thuật toán DFS// BFS viết chương trình tìm đường đi từ đỉnh u đến đỉnh

v của đồ thị .Nếu không tồn tại đường đi thì đưa ra thông báo “Không tồn tại đường
đi”.Nếu tồn tại đường đi từ u đến v hãy ghi lại đường đi theo thứ tự ngược từ v đến
u vào file ketqua.out ( như hình dưới đây)
Dothi.in
515

Ketqua.Out

2

5<=


4<=

3<=

2<=

1

134
24
135
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 50
#define TRUE 1
#define FALSE 0
int A[MAX][MAX],u,v, n,m=0,chuaxet[MAX], truoc[MAX], s, t;
FILE *fp;
void read_data(void){//doc du lieu ma tran ke
int i,j;FILE *fp;
fp=fopen("dothi.in","r");
//fscanf(fp,"%d",&n);
fscanf(fp,"%d%d%d",&n,&s,&t);
//printf("\n So dinh do thi:%d",n);
for(i=1; i<=n; i++){
21



printf("\n");
//chuaxet[i]=TRUE;truoc[i]=0;
for(j=1; j<=n; j++){
fscanf(fp,"%d",&A[i][j]);
//printf("%3d",A[i][j]);
}
}
fclose(fp);
}
// khoi tao gia tri ma tran =0
void Init(void) {
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
A[i][j]=0;
}
//Doc danh sach ke sang ma tran ke
void read_DSK(void){
int dau, cuoi; char str[132], tu[12];
//Doc va chuyen doi thanh ma tran ke
fp = fopen("DSKE.TXT","r");
if(fp==NULL){
printf("\n Do thi khong ton tai"); getch(); return;
}
// doc gia so dinh cua do thi
fgets(str, 132, fp);n = atoi(str);
// fscanf(fp,"%d%d%d",&n,&s,&t);
// printf("\n So dinh do thi:%d",n);
// printf("\n So dinh do thi:%d",s);
// printf("\n So dinh do thi:%d",t);

Init();
for( dau=1; dau<=n; dau++){
fgets(str,132,fp);
for(int j=0, p=0; j<=strlen(str); j++){
//tach tu
if(str[j]!=' '&&str[j]!='\t'&&str[j]!='\0'&& str[j]!='\n'){
tu[p]=str[j]; p++;
}
else if( p>0 && (str[j]==' '||str[j]=='\t'||str[j]=='\0'||str[j]=='\n')){
tu[p]='\0'; p=0;cuoi=atoi(tu);
if(cuoi!=0) { m++; A[dau][cuoi]=1; }
//thiet lap gia tri cho ma tran ke
}
22


}
}
fclose(fp);
/*for(int i=1; i<=n; i++){
//printf("\n");
chuaxet[i]=TRUE;truoc[i]=0;
for(int j=1; j<=n; j++)
printf("%3d",A[i][j]);}*/
}
void DFS(int u){//Thu?t toán DFS
int v;
//printf("%3d",u);
chuaxet[u]=FALSE;
for(v=1; v<=n; v++){

if(A[u][v] && chuaxet[v]){
truoc[v]=u;
DFS(v);
}
}
} void BFS(int i){//Thu?t toán BFS
int queue[MAX], low=1, high=1, u, v;
queue[low]=i;
chuaxet[i]=FALSE;
while(low<=high){
u = queue[low];low=low+1;
for(v=1; v<=n; v++){
if(A[u][v] && chuaxet[v]){
high = high+1;queue[high]=v;
truoc[v]=u; chuaxet[v]=FALSE;
}
}
}
}
void Duongdi (void){
FILE *fp;
fp = fopen("ketqua.out","w");
if (truoc[t]==0){
printf("\n Khong ton tai duong di");
getch(); return;
}
23


//printf("\n Duong di:");

int j = t;fprintf(fp,"%3d<=",j);
while(truoc[j]!=s){
fprintf(fp,"%3d<=",truoc[j]);j=truoc[j];
}
fprintf(fp,"%3d",s);
//getch();
fclose(fp);
}
//Khoi dau lai mang chuaxet[]
//Khoi dau lai mang chuaxet[]
void ReInit(void) {
for (int i=1; i<=n; i++) {
chuaxet[i]=TRUE;truoc[i]=0;
}
}
int main (void){
fp = fopen("DSKE.TXT","r");
fscanf(fp,"%d%d%d",&n,&s,&t);
// printf("\n So dinh u:%d\n",s);
// printf("\n So dinh v:%d\n",t);
//read_data(); // dang ma tran ke
read_DSK(); //dang danh sach ke
ReInit(); // khoi tao mang chua xet
DFS(s); //BFS(s);
Duongdi ();
fclose(fp);
}

24



2 Duyệt các thành phần liên thông
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAX 100
int A[MAX][MAX], n, m=0,chuaxet[MAX], solt=0,count = 0;
int u,v,truoc[MAX] ;
FILE *fp;
// khoi tao gia tri ma tran =0
void Init(void) {
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
A[i][j]=0;
}
// doc danh sach canh va chuyen sang ma tran ke
void read_DSC(void){
fp=fopen("dscanh.in","r");
fscanf(fp,"%d%d",&n,&m);
printf("\n So dinh do thi:%2d",n);
//khoi tao
Init();
// doc du lieu danh sach
for(int i=1;i<=m;i++){
fscanf(fp,"%d%d",&u,&v);
A[u][v]=A[v][u]=1;
}

fclose(fp);
}
//Doc danh sach ke sang ma tran ke
void read_DSK(void){
int dau, cuoi; char str[132], tu[12];
//Doc va chuyen doi thanh ma tran ke
fp = fopen("DSKE.TXT","r");
if(fp==NULL){
printf("\n Do thi khong ton tai"); getch(); return;
}
// doc gia so dinh cua do thi
fgets(str, 132, fp);n = atoi(str);
25


×