You are on page 1of 5

Tìm Đường đi giữa 2 đỉnhtrên đồ thị : (có hướng và vô hướng )v: code tương tự thuật toán

dfs và bfs nhưng duy trì thêm mảng parent để truy vết đường đi . giả sử cần tìm đường đi từ
đỉnh s tới đỉnh f, ta gọi bfs(s) hoặc dfs(s).DFS

Tư duy thuật toán:


DFS (Depth-First Search): Bắt đầu từ đỉnh s, duyệt đồ thị theo chiều sâu. Khi gặp một đỉnh
chưa được thăm, đánh dấu nó là đã thăm và lưu đỉnh cha của nó vào mảng parent. Tiếp tục
duyệt các đỉnh kề chưa được thăm, đệ quy gọi hàm DFS cho mỗi đỉnh kề đó. Khi tìm thấy
đỉnh đích f, kết thúc thuật toán và truy vết đường đi từ f về s bằng cách sử dụng mảng
parent.
BFS (Breadth-First Search): Bắt đầu từ đỉnh s, duyệt đồ thị theo chiều rộng. Sử dụng một
hàng đợi để lưu các đỉnh cần duyệt, bắt đầu bằng việc đưa đỉnh s vào hàng đợi. Duyệt từng
đỉnh trong hàng đợi, và duyệt qua tất cả các đỉnh kề chưa được thăm của từng đỉnh đó. Khi
tìm thấy đỉnh đích f, kết thúc thuật toán và truy vết đường đi từ f về s bằng cách sử dụng
mảng parent.
Trong cả hai trường hợp, sau khi tìm thấy đường đi từ s tới f, ta có thể truy vết đường đi
bằng cách sử dụng mảng parent. Điều này cho phép chúng ta biết được đường đi cụ thể từ
đỉnh s tới f.

using System;
using System.Collections.Generic;
using System.Text;

class Graph
{
private int V; // Số đỉnh
private List<int>[] adj; // Danh sách kề

public Graph(int v)
{
V = v;
adj = new List<int>[V];
for (int i = 0; i < V; ++i)
adj[i] = new List<int>();
}

public void AddEdge(int v, int w)


{
adj[v].Add(w); // Thêm w vào danh sách kề của v
}

public List<int> DFS(int s, int f)


{
bool[] visited = new bool[V]; // Mảng để đánh dấu các đỉnh đã được thăm
int[] parent = new int[V]; // Mảng để lưu đỉnh cha của mỗi đỉnh
List<int> path = new List<int>();

DFSUtil(s, f, visited, parent);

// Truy vết đường đi từ đỉnh f về đỉnh s


int current = f;
while (current != s)
{
path.Add(current);
current = parent[current];
}
path.Add(s);

// Đảo ngược đường đi để hiển thị theo chiều từ s đến f


path.Reverse();

return path;
}

private void DFSUtil(int v, int f, bool[] visited, int[] parent)


{
visited[v] = true; // Đánh dấu đỉnh v đã được thăm

// Duyệt qua tất cả các đỉnh kề của đỉnh v


foreach (int i in adj[v])
{
if (!visited[i]) // Nếu đỉnh kề chưa được thăm
{
parent[i] = v; // Lưu đỉnh cha của đỉnh i
DFSUtil(i, f, visited, parent); // Gọi đệ quy để thăm đỉnh kề
}
if (i == f) return; // Nếu đã tìm thấy đỉnh đích, kết thúc thuật toán
}
}

public List<int> BFS(int s, int f)


{
bool[] visited = new bool[V]; // Mảng để đánh dấu các đỉnh đã được thăm
int[] parent = new int[V]; // Mảng để lưu đỉnh cha của mỗi đỉnh
List<int> path = new List<int>();

Queue<int> queue = new Queue<int>();


queue.Enqueue(s);
visited[s] = true;

while (queue.Count != 0)
{
int v = queue.Dequeue();

// Duyệt qua tất cả các đỉnh kề của đỉnh v


foreach (int i in adj[v])
{
if (!visited[i]) // Nếu đỉnh kề chưa được thăm
{
visited[i] = true; // Đánh dấu đỉnh i đã được thăm
parent[i] = v; // Lưu đỉnh cha của đỉnh i
queue.Enqueue(i);
}
if (i == f) // Nếu đã tìm thấy đỉnh đích, kết thúc thuật toán
{
// Truy vết đường đi từ đỉnh f về đỉnh s
int current = f;
while (current != s)
{
path.Add(current);
current = parent[current];
}
path.Add(s);

// Đảo ngược đường đi để hiển thị theo chiều từ s đến f


path.Reverse();

return path;
}
}
}

return path;
}
}

class Program
{
static void Main(string[] args)
{
Console.InputEncoding = Encoding.UTF8;
Console.OutputEncoding = Encoding.UTF8;
Graph g = new Graph(10);
g.AddEdge(0, 1);
g.AddEdge(0, 2);
g.AddEdge(1, 3);
g.AddEdge(1, 4);
g.AddEdge(2, 5);
g.AddEdge(2, 6);
g.AddEdge(3, 7);
g.AddEdge(4, 8);
g.AddEdge(5, 9);
g.AddEdge(6, 9);
g.AddEdge(7, 9);
g.AddEdge(8, 9);

int s = 0; // Đỉnh bắt đầu


int f = 9; // Đỉnh đích
Console.WriteLine("Đường đi từ đỉnh " + s + " đến đỉnh " + f + " (DFS):");
List<int> dfsPath = g.DFS(s, f);
foreach (int vertex in dfsPath)
{
Console.Write(vertex + " ");
}
Console.WriteLine();

Console.WriteLine("Đường đi từ đỉnh " + s + " đến đỉnh " + f + " (BFS):");


List<int> bfsPath = g.BFS(s, f);
foreach (int vertex in bfsPath)
{
Console.Write(vertex + " ");
}
Console.WriteLine();
}
}

You might also like