/****************************/ /* 縦型探索(最短経路) */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; import java.util.*; class Pair { int node; // ノード番号 int r; // スタートからの距離 Pair (int node1, int r1) { node = node1; r = r1; } } class Search { /********************************************/ /* 縦型探索(最短経路) */ /* n : ノードの数 */ /* ノード0:スタート */ /* ノード(n-1):ゴール */ /* r : ノード間の距離 */ /* rd : 現時点におけるノードまでの距離 */ /********************************************/ static void depth(int n, int r[][], int rd[]) { int i1, k, v, r1, node = 1; Pair pair; Stack <Pair> q = new Stack <Pair> (); q.push(new Pair(0, 0)); while (!q.isEmpty()) { pair = q.pop(); k = pair.node; v = pair.r; // 先頭のノードから到達可能なノードをスタックに追加 // (既にノードまでの距離が計算済みであり,その // 距離が今回計算した距離よりも短い場合は除く) for (i1 = 0; i1 < n; i1++) { if (r[k][i1] >= 0) { r1 = v + r[k][i1]; if (rd[i1] < 0 || r1 < rd[i1]) { q.push(new Pair(i1, r1)); rd[i1] = r1; node++; } } } } System.out.printf("展開したノード数: %d, 最短距離: %d\n", node, rd[n-1]); } } public class Test { public static void main (String[] args) { int i1, i2, r[][] = new int [7][7], rd[] = new int [7]; for (i1 = 0; i1 < 7; i1++) { rd[i1] = -1; for (i2 = 0; i2 < 7; i2++) r[i1][i2] = -1; } rd[0] = 0; 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.depth(7, r, rd); } } ----------------再帰関数の利用---------------- /****************************/ /* 縦型探索(最短経路) */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; class Search { /********************************************/ /* 縦型探索(最短経路) */ /* n : ノードの数 */ /* ノード0:スタート */ /* ノード(n-1):ゴール */ /* r : ノード間の距離 */ /* rd : 現時点におけるノードまでの距離 */ /* d : 深さ */ /* now : 現在のノード */ /********************************************/ static void depth(int n, int r[][], int rd[], int d, int now) { int i1, r1; for (i1 = 0; i1 < n; i1++) { if (r[now][i1] >= 0) { r1 = rd[now] + r[now][i1]; if (rd[i1] < 0 || r1 < rd[i1]) { rd[i1] = r1; depth(n, r, rd, d+1, i1); } } } } } public class Test { public static void main (String[] args) { int i1, i2, r[][] = new int [7][7], rd[] = new int [7]; for (i1 = 0; i1 < 7; i1++) { rd[i1] = -1; for (i2 = 0; i2 < 7; i2++) r[i1][i2] = -1; } rd[0] = 0; 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.depth(7, r, rd, 1, 0); System.out.printf("最短距離: %d\n", rd[6]); } }