/****************************/ /* Dijkstra(最短経路) */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; import java.util.*; class Comp implements Comparator <Net> { public int compare (Net n1, Net n2) { if (n1.r == n2.r) return n1.node - n2.node; else return n1.r - n2.r; } } class Net { int node; // ノード番号 int r; // スタートからの距離 Net (int node1, int r1) { node = node1; r = r1; } } class Search { /********************************************/ /* Dijkstra(最短経路) */ /* n : ノードの数 */ /* ノード0:スタート */ /* ノード(n-1):ゴール */ /* r : ノード間の距離 */ /* rd : 現時点におけるノードまでの距離 */ /* used : 距離が確定したか否か */ /********************************************/ static void width(int n, int r[][], int rd[], boolean used[]) { int i1, k, v, r1, node = 1; Net net; Comparator<Net> cp = new Comp(); TreeSet <Net> s = new TreeSet <Net> (cp); s.add(new Net(0, 0)); while (!s.isEmpty()) { net = s.first(); k = net.node; v = net.r; if (!used[k]) { // 先頭のノードから到達可能なノードをセットに追加 // ・距離が決定しているノードは除く // ・既にノードまでの距離が計算済みであり,その距離が // 今回計算した距離よりも短い場合は距離を修正して追加 used[k] = true; for (i1 = 0; i1 < n; i1++) { if (!used[i1] && r[k][i1] >= 0) { r1 = v + r[k][i1]; if (rd[i1] < 0 || r1 < rd[i1]) { s.add(new Net(i1, r1)); rd[i1] = r1; node++; } } } } s.remove(net); } 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]; boolean used[] = new boolean [7]; for (i1 = 0; i1 < 7; i1++) { used[i1] = false; 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.width(7, r, rd, used); } } -----------------TreeSet を使用しない方法---------------- /****************************/ /* Dijkstra(最短経路) */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; import java.util.*; class Search { /********************************************/ /* Dijkstra(最短経路) */ /* n : ノードの数 */ /* ノード0:スタート */ /* ノード(n-1):ゴール */ /* r : ノード間の距離 */ /* rd : 現時点におけるノードまでの距離 */ /* used : 距離が確定したか否か */ /********************************************/ static void Dijkstra(int n, int r[][], int rd[], boolean used[]) { int i1, r1, node = 1, nx, next = 0; while (next >= 0) { // 先頭のノードから到達可能なノードを調べる // ・距離が決定しているノードは除く // ・既にノードまでの距離が計算済みであり,その距離が // 今回計算した距離よりも短い場合は距離を修正して追加 nx = next; next = -1; used[nx] = true; for (i1 = 0; i1 < n; i1++) { if (!used[i1]) { if (r[nx][i1] >= 0) { r1 = rd[nx] + r[nx][i1]; if (rd[i1] < 0 || r1 < rd[i1]) { rd[i1] = r1; node++; } } if (next < 0 || rd[i1] >= 0 && rd[i1] < rd[next]) next = i1; } } } 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]; boolean used[] = new boolean [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.Dijkstra(7, r, rd, used); } }