You are on page 1of 4

1.

Cho một đồ thị có hướng với n đỉnh, các for (int i = 0; i <= n; i++){
đỉnh được đánh số từ 1 tới n. Hãy viết hàm
b[i] = true;
kiểm tra xem có tồn tại đường đi từ đỉnh u tới
đỉnh v (u khác v) hay không? }
Các cạnh của đồ thị được biểu diễn dưới dạng // Khởi tạo ma trận kề bằng false
mảng 2 chiều. Ví dụ:
for (int i = 1; i <= n; i++){
e = [[1, 2], [2, 3]] có nghĩa là có cạnh nối giữa
đỉnh 1 và đỉnh 2, đỉnh 2 và đỉnh 3. for (int j = 1; j <= n; j++){

#include <bits/stdc++.h> a[i][j] = false;

using namespace std; }

typedef vector<int> vi; }

typedef vector<vi> vvi;

bool b[100001]; // Đánh dấu các cạnh trên ma trận kề

bool a[1001][1001]; for (int i = 0; i < e.size(); i++){

bool kt = false; a[e[i][0]][e[i][1]] = true;

void dfs(int u, int v, int n){ }

b[u] = false;

for (int i = 1; i <= n; i++){ // Duyệt đồ thị để kiểm tra có đường đi từ u


đến v hay không
if (a[u][i] && b[i]){
dfs(u, v, n);
if (i == v){

kt = true;
// Trả về kết quả
}
return kt;
dfs(i, v, n);
}
b[i] = true;

}
int main()
}
{
}
// Đọc dữ liệu từ input
bool check(int n, vvi e, int u, int v)
int n, m, u, v;
{
cin >> n >> m >> u >> v;
// Khởi tạo mảng đánh dấu bằng true
// Khởi tạo danh sách cạnh
vvi e(m, vi(2)); const int MAXN = 1001;

for (int i = 0; i < m; i++){

cin >> e[i][0] >> e[i][1]; bool b[MAXN];

} int c[MAXN];

bool a[MAXN][MAXN];

// Kiểm tra xem có đường đi từ u đến v hay


không
int bfs(int u, int v, int n){
bool result = check(n, e, u, v);
int kq = n+1;

queue<int> q;
// Xuất kết quả
q.push(u);
if (result){
b[u] = false;
cout << "YES\n";
while(!q.empty()){
} else {
int k = q.front();
cout << "NO\n";
for (int i = 1; i <=n; i++){
}
if (a[k][i] && b[i]){

c[i] = c[k] + 1;
return 0;
b[i] = false;
}
q.push(i);
2.Có n thành phố được đánh số từ 1 đến n.
if (i == v) break;
Cho ma trận a thể hiện tính liên thông giữa các
thành phố, ví dụ a = [[1, 2], [3, 4]] có nghĩa là: }
Thành phố 1 và 2 có thể đi đến với nhau với }
quãng đường là 1.
q.pop();
Thành phố 3 và 4 cũng tương tự.
}
Cho hai số u và v phân biệt. Hãy đưa ra quãng
đường ngắn nhất để đi từ thành phố u đến return c[v];
thành phố v. Trả về -1 nếu từ thành phố u }
không thể đi đến thành phố v.

#include <bits/stdc++.h>
int graphFunction(int n, vector<vector<int>> e,
using namespace std; int u, int v)

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

b[i] = true; }

c [i] = 0; 3.Có n thành phố được đánh số từ 1 đến n.


Cho ma trận a thể hiện tính liên thông giữa các
}
thành phố, ví dụ a = [[1, 2], [3, 4]] có nghĩa là:
for (int i = 1; i <= n; i++){
Thành phố 1 và 2 có thể đi đến với nhau với
for (int j = 1; j <= n; j++){ quãng đường là 1.

a[i][j] = false; Thành phố 3 và 4 cũng tương tự.

} Cho hai số u và v phân biệt. Hãy đưa ra quãng


đường daif nhất để đi từ thành phố u đến
} thành phố v, với điều kiện mỗi thành phố chỉ
for (int i = 0; i < e.size(); i++){ đi qua một lần . Trả về -1 nếu từ thành phố u
không thể đi đến thành phố v.
a[e[i][0]][e[i][1]] = true;
#include <bits/stdc++.h>
a[e[i][1]][e[i][0]] = true;
using namespace std;
}

int k = bfs(u, v, n);


const int MAX = 1001;
return (k == 0) ? -1 : k;

}
bool b[MAX];

bool a[MAX][MAX];
int main()
int M = -1;
{

int n, m, u, v;
void dfs(int u, int v, int n, int count) {
cin >> n >> m >> u >> v;
b[u] = false;
vector<vector<int>> e(m);
for (int i = 1; i <= n; i++) {
for (int i = 0; i < m; i++) {
if (a[u][i] && b[i]) {
int u, v;
if (i == v) {
cin >> u >> v;
if (count + 1 > M) {
e[i] = {u, v};
M = count + 1;
}
break;
int ans = graphFunction(n, e, u, v);
}
cout << ans << endl;
} for (int i = 0; i < m; i++) {

dfs(i, v, n, count + 1); int u, v;

b[i] = true; cin >> u >> v;

} e[i] = {u, v};

} }

} int ans = graphFunction(n, e, u, v);

cout << ans << endl;

int graphFunction(int n, return 0;


std::vector<std::vector<int>> e, int u, int v) {
}
for (int i = 0; i <= n; i++) {

b[i] = true;

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

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

a[i][j] = false;

for (int i = 0; i < e.size(); i++) {

a[e[i][0]][e[i][1]] = true;

a[e[i][1]][e[i][0]] = true;

dfs(u, v, n, 0);

return M;

int main() {

int n, m, u, v;

cin >> n >> m >> u >> v;

vector<vector<int>> e(m);

You might also like