Найкоротший шлях у графі від до шукаємо за допомогою пошуку в ширину.
Приклад
Граф, наведений у прикладі, має вигляд:
Реалізація алгоритму
Оголосимо матрицю суміжності для зберігання графа, а також масив для зберігання найкоротших відстаней від джерела до вершин.
#define MAX 101
int g[MAX][MAX], dist[MAX];Функція bfs реалізує пошук у ширину з вершини .
void bfs(int start)
{Ініціалізуємо масив . Якщо dist[i] = -1, то вершина ще не відвідана.
memset(dist, -1, sizeof(dist));
dist[start] = 0;Оголошуємо і ініціалізуємо чергу .
queue<int> q;
q.push(start);Продовжуємо пошук у ширину, поки черга не пуста.
while (!q.empty())
{Витягуємо і видаляємо вершину з голови черги.
int v = q.front(); q.pop();Куди можна піти з вершини ? Перебираємо ребра v → to.
for (int to = 1; to <= n; to++)Якщо з є ребро в , і при цьому вершина ще не пройдена, то йдемо в неї (ребро (v, to) є ребром дерева при пошуку в ширину).
if (g[v][to] && dist[to] == -1)
{Заносимо вершину в кінець черги. Обчислюємо найкоротшу відстань dist[to].
q.push(to);
dist[to] = dist[v] + 1;
}
}
}Основна частина програми. Читаємо вхідні дані.
scanf("%d %d %d", &n, &s, &f);
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
scanf("%d", &g[i][j]);Запускаємо пошук у ширину з вершини .
bfs(s);Виводимо найкоротшу відстань. Якщо шляху до вершини не існує (dist[f] < 0), то встановлюємо dist[f] = 0.
if (dist[f] < 0) dist[f] = 0;
printf("%d\n", dist[f]);Реалізація алгоритму — список суміжності
Оголосимо список суміжності для зберігання графа, а також масив для зберігання найкоротших відстаней від джерела до вершин.
vector<vector<int> > g;
vector<int> dist;Функція bfs реалізує пошук у ширину з вершини .
void bfs(int start)
{Ініціалізуємо масив . Якщо dist[i] = -1, то вершина ще не відвідана.
dist = vector<int>(n + 1, -1);
dist[start] = 0;Оголошуємо і ініціалізуємо чергу .
queue<int> q;
q.push(start);Продовжуємо пошук у ширину, поки черга не пуста.
while (!q.empty())
{Витягуємо і видаляємо вершину з голови черги.
int v = q.front(); q.pop();Куди можна піти з вершини ? Перебираємо ребра v → to.
for (int to : g[v])Якщо вершина ще не пройдена, то йдемо в неї (ребро (v, to) є ребром дерева при пошуку в ширину).
if (dist[to] == -1)
{Заносимо вершину в кінець черги. Обчислюємо найкоротшу відстань dist[to].
q.push(to);
dist[to] = dist[v] + 1;
}
}
}Основна частина програми. Читаємо вхідні дані.
scanf("%d %d %d", &n, &s, &f);
g.resize(n + 1);
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
scanf("%d", &val);
if (val == 1) g[i].push_back(j);
}Запускаємо пошук у ширину з вершини .
bfs(s);Виводимо найкоротшу відстань. Якщо шляху до вершини не існує (dist[f] < 0), то встановлюємо dist[f] = 0.
if (dist[f] < 0) dist[f] = 0;
printf("%d\n", dist[f]);Java реалізація — матриця суміжності
import java.util.*;
public class Main
{
static int g[][], dist[];
static int n, s, f;
static void bfs(int start)
{
Arrays.fill(dist,-1);
dist[start] = 0;
Queue<Integer> q = new LinkedList<Integer>();
q.add(start);
while(!q.isEmpty())
{
int v = q.poll();
for(int to = 1; to <= n; to++)
if (g[v][to] == 1 && dist[to] == -1)
{
q.add(to);
dist[to] = dist[v] + 1;
}
}
}
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
n = con.nextInt();
s = con.nextInt();
f = con.nextInt();
g = new int[n+1][n+1];
dist = new int[n+1];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
g[i][j] = con.nextInt();
bfs(s);
if (dist[f] < 0) dist[f] = 0;
System.out.println(dist[f]);
con.close();
}
} Java реалізація — список суміжності
import java.util.*;
public class Main
{
static ArrayList<Integer>[] g;
static int dist[];
static void bfs(int start)
{
Arrays.fill(dist,-1);
dist[start] = 0;
Queue<Integer> q = new LinkedList<Integer>();
q.add(start);
while(!q.isEmpty())
{
int v = q.poll();
for(int i = 0; i < g[v].size(); i++)
{
int to = g[v].get(i);
if (dist[to] == -1)
{
q.add(to);
dist[to] = dist[v] + 1;
}
}
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int n = con.nextInt();
int s = con.nextInt();
int f = con.nextInt();
g = new ArrayList[n+1];
for(int i = 0; i <= n; i++)
g[i] = new ArrayList<Integer>();
dist = new int[n+1];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
int val = con.nextInt();
if (val == 1) g[i].add(j);
}
bfs(s);
if (dist[f] < 0) dist[f] = 0;
System.out.println(dist[f]);
con.close();
}
} Python реалізація — матриця суміжності
Імпортуємо двосторонню чергу.
from collections import dequeФункція bfs реалізує пошук у ширину з вершини .
def bfs(start):Ініціалізуємо глобальний список . Якщо dist[i] = -1, то вершина ще не відвідана.
global dist
dist = [-1] * (n + 1)
dist[start] = 0Оголошуємо і ініціалізуємо чергу .
q = deque([start])Продовжуємо пошук у ширину, поки черга не пуста.
while q:Витягуємо і видаляємо вершину з голови черги.
v = q.popleft()Куди можна піти з вершини ? Перебираємо ребра v → to.
for to in range(1, n + 1):Якщо з є ребро в , і при цьому вершина ще не пройдена, то йдемо в неї (ребро (v, to) є ребром дерева при пошуку в ширину).
if g[v][to] == 1 and dist[to] == -1:Заносимо вершину в кінець черги. Обчислюємо найкоротшу відстань dist[to].
q.append(to)
dist[to] = dist[v] + 1Основна частина програми. Читаємо вхідні дані.
n, s, f = map(int, input().split())
g = [[] for _ in range(n + 1)]
for i in range(1, n + 1):
g[i] = [0] + list(map(int, input().split()))Запускаємо пошук у ширину з вершини .
bfs(s)Виводимо найкоротшу відстань. Якщо шляху до вершини не існує (dist[f] < 0), то встановлюємо dist[f] = 0.
if dist[f] < 0: dist[f] = 0
print(dist[f])Python реалізація — список суміжності
Імпортуємо двосторонню чергу.
from collections import dequeФункція bfs реалізує пошук у ширину з вершини .
def bfs(start):Ініціалізуємо глобальний список . Якщо dist[i] = -1, то вершина ще не відвідана.
global dist
dist = [-1] * (n + 1)
dist[start] = 0Оголошуємо і ініціалізуємо чергу .
q = deque([start])Продовжуємо пошук у ширину, поки черга не пуста.
while q:Витягуємо і видаляємо вершину з голови черги.
v = q.popleft()Куди можна піти з вершини ? Перебираємо ребра v → to.
for to in g[v]:Якщо вершина ще не пройдена, то йдемо в неї (ребро (v, to) є ребром дерева при пошуку в ширину).
if dist[to] == -1:Заносимо вершину в кінець черги. Обчислюємо найкоротшу відстань dist[to].
q.append(to)
dist[to] = dist[v] + 1Основна частина програми. Читаємо вхідні дані.
n, s, f = map(int, input().split())Ініціалізуємо і будуємо список суміжності .
g = [[] for _ in range(n + 1)]
for i in range(1, n + 1):
row = [0] + list(map(int, input().split()))
for j in range(1, n + 1):
if row[j] == 1: g[i].append(j)Запускаємо пошук у ширину з вершини .
bfs(s)Виводимо найкоротшу відстань. Якщо шляху до вершини не існує (dist[f] < 0), то встановлюємо dist[f] = 0.
if dist[f] < 0: dist[f] = 0
print(dist[f])