Занятие 8. Справочник
Занятие 8. Справочник
Алгоритм Дейкстры по матрице смежности с формированием массива предков
Переменные, массивы и константаINF
static final int INF = Integer.MAX_VALUE; static int n, s, np = 0; static boolean[] used; static int[] dist; static int[] parent; static int[][] graph; staticintpath[];Чтение данных, подготовка массивов
n = in.nextInt(); s = in.nextInt() - 1; f = in.nextInt() - 1; graph = new int[n][n]; used = new boolean[n]; dist = new int[n]; parent = new int[n]; path = new int[n]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) graph[i][j] = in.nextInt(); for (int i = 0; i < n; i++) dist[i] = INF;Собственно,алгоритм
static void dijkstra(int s) { parent[s] = -1; dist[s] = 0; for (int i = 0; i < n; i++) { int v = -1; for (int j = 0; j < n; j++) { if (!used[j] && (v == -1 || dist[j] < dist[v])) v = j; used[v] = true; for (int j = 0; j < n; j++) { if (dist[v] + graph[v][j] < dist[j] && graph[v][j] != -1) { dist[j] = dist[v] + graph[v][j]; parent[j] = v; } } } }Восстановление пути (рекурсивно, для формирования пути в прямом порядке)
static void recoverPath(int v) { if (v != s) recoverPath(parent[v]); path[np++] = v; }(запускается с параметром f)