Professional Documents
Culture Documents
cấu trúc dữ liệu đồ thị
cấu trúc dữ liệu đồ thị
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++){
b[u] = false;
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;
} int c[MAXN];
bool a[MAXN][MAXN];
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; }
}
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++) {
} }
b[i] = true;
a[i][j] = false;
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;
vector<vector<int>> e(m);