/****************************/
/* 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);
}
}