/****************************/
/* 動的計画法(最短経路) */
/* coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.util.*;
class Search
{
/********************************************/
/* 動的計画法(最短経路) */
/* n : ノードの数 */
/* ノード0:スタート */
/* ノード(n-1):ゴール */
/* r : ノード間の距離 */
/********************************************/
static void dynamic(int n, int r[][])
{
int i1, i2, r1, nx = 0, k1 = 0, k2 = 1, rd[][] = new int [2][n];
boolean sw = true;
// 初期設定
for (i1 = 0; i1 < n; i1++)
rd[0][i1] = -1;
rd[0][0] = 0;
// 実行
while (sw) {
if (nx%2 == 0) {
k1 = 0;
k2 = 1;
}
else {
k1 = 1;
k2 = 0;
}
sw = false;
for (i1 = 0; i1 < n; i1++) {
rd[k2][i1] = rd[k1][i1];
for (i2 = 0; i2 < n; i2++) {
if (rd[k1][i2] >= 0 && r[i2][i1] >= 0) {
r1 = rd[k1][i2] + r[i2][i1];
if (rd[k2][i1] < 0 || r1 < rd[k2][i1]) {
rd[k2][i1] = r1;
sw = true;
}
}
}
}
nx++;
}
System.out.printf("ステップ: %d, 最短距離: %d\n", nx, rd[k1][n-1]);
}
}
public class Test
{
public static void main (String[] args)
{
int i1, i2, r[][] = new int [7][7];
for (i1 = 0; i1 < 7; i1++) {
for (i2 = 0; i2 < 7; i2++)
r[i1][i2] = -1;
}
r[0][1] = 2;
r[1][0] = 2;
r[0][2] = 5;
r[2][0] = 5;
r[1][2] = 4;
r[2][1] = 4;
r[1][3] = 6;
r[3][1] = 6;
r[1][4] = 10;
r[4][1] = 10;
r[2][3] = 2;
r[3][2] = 2;
r[3][5] = 1;
r[5][3] = 1;
r[4][5] = 3;
r[5][4] = 3;
r[4][6] = 5;
r[6][4] = 5;
r[5][6] = 9;
r[6][5] = 9;
Search.dynamic(7, r);
}
}