Занятие 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)