You are on page 1of 14

1.

Viết chương trình duyệt tất cả các thành phần liên thông của đồ thị
biểu diễn dưới dạng ma trận kề sử dụng DFS.

1.1 Code

#include <bits/stdc++.h>

using namespace std;

int n, u;

int a[1000][1000];

bool chuaXet[1000];

void DFS(int u) {

std::stack<int> Stack;

Stack.push(u);

chuaXet[u] = false;

cout<<u<<" ";

while (!Stack.empty()) {

int s = Stack.top(); Stack.pop();

for (int i = 1; i <= n; i++) {

if(a[s][i] == 1 && chuaXet[i] == true) {

chuaXet[i] = false;

cout<<i<<" ";

Stack.push(s);

Stack.push(i);

break;

}
}

void reInit() {

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

chuaXet[i] = true;

for (int i = 1; i <= n; i++) {

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

a[i][j] = 0;

int main() {

cout << "Nhap so dinh cua do thi: ";

cin >> n;

cout << "Nhap ma tran ke cua do thi: \n";

reInit();

for (int i = 1; i <= n; i++) {

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

cin >> a[i][j];

int soLt = 0;

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

if(chuaXet[i] == true) {

soLt = soLt + 1;
cout<<endl<<"Thanh phan lien thong thu "<<soLt<<": ";

DFS(i);

return 0;

1.2 Test 1
0010101000000
0001010000000
1000101000100
0100010101000
1010001010101
0101000101000
1010100010000
0001010001010
0000101000101
0001010100010
0010100010001
0000000101000
0000100010100
1.2 Test 2
000
000
000

1.3 Test 3
0100
1000
0000
0000
2. Viết chương trình đọc vào 1 đồ thị có hướng biểu diễn dưới dạng ma
trận kề, kiểm tra tính liên thông mạnh của đồ thị sử dụng BFS.

2.1 Code

#include <bits/stdc++.h>

using namespace std;

int n, u;

int a[1000][1000];

bool chuaXet[1000];

void BFS(int u) {

std::queue<int> Queue;

Queue.push(u);

chuaXet[u] = false;

while(!Queue.empty()) {
int s = Queue.front(); Queue.pop();

cout<<s<<" ";

for(int i = 1; i <= n; i++) {

if(a[s][i] == 1 && chuaXet[i] == true) {

Queue.push(i);

chuaXet[i] = false;

void reInit() {

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

chuaXet[i] = true;

int main() {

cout << "Nhap so dinh cua do thi: ";

cin >> n;

cout << "Nhap ma tran ke cua do thi: \n";

reInit();

for (int i = 1; i <= n; i++) {

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

cin >> a[i][j];

}
for(int i = 1; i <= n; i++) {

reInit();

cout<<endl;

BFS(i);

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

if(chuaXet[j] == true) {

cout<<endl<<"Do thi khong lien thong manh";

return 0;

cout<<endl<<"Do thi lien thong manh";

return 0;

2.2 Test 1
0010101000000
0001010000000
1000101000100
0100010101000
1010001010101
0101000101000
1010100010000
0001010001010
0000101000101
0001010100010
0010100010001
0000000101000
0000100010000
2.3 Test 2

0000010000000
0010000100000
0000000010001
1000010000000
0000001000000
0000000001010
0000000000101
0001000000010
0000101000000
0110000000000
0100000100000
0001000001000
0000000010100
2.4 Test 3

0100
0000
0001
0000
3. Viết chương trình đọc vào 1 đồ thị biểu diễn dưới dạng danh sách kề,
tìm đường đi từ s đến t (s, t được nhập vào từ bàn phím) sử dụng DFS
hoặc BFS. In ra kết quả.

3.1 Code

#include <bits/stdc++.h>

using namespace std;


int n, sTart, eNd;
int a[1000][1000];
bool chuaXet[1000];
int truoc[1000];

void BFS(int u) {
std::queue<int> Queue;
Queue.push(u);
chuaXet[u] = false;
while(!Queue.empty()) {
int s = Queue.front(); Queue.pop();
// cout<<s<<" ";
for(int i = 1; i <= n; i++) {
if(a[s][i] == 1 && chuaXet[i] == true) {
Queue.push(i);
chuaXet[i] = false;
truoc[i] = s;

if(i == eNd) {
return;
}

}
}
}
}

void reInit() {
for (int i = 1; i <= n; i++)
chuaXet[i] = true;
}

int main() {
cout << "Nhap so dinh cua do thi: ";
cin >> n >> sTart >> eNd;
cout << "Nhap ma tran ke cua do thi:\n";
reInit();

for (int i = 1; i <= n; i++) {


for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}

BFS(sTart);
do {
cout<<eNd<<" ";
eNd = truoc[eNd];
}while(eNd != sTart);
cout<< sTart<< " ";
return 0;
}

3.2 Test 1
0000010000000
0010000100000
0000000010001
1000010000000
0000001000000
0000000001010
0000000000101
0001000000010
0000101000000
0110000000000
0100000100000
0001000001000
0000000010100
3.3 Test 2

3.4 Test 3

You might also like