ダイクストラ法をJavaで書く.
たぶんダイクストラ法と呼ばれるものだと思う.
何回も書くのがめんどそうなのでクラス化.
隣接行列実装
static class DijkstraMatrix { int[][] a; boolean[] b; PriorityQueue<int[]> q; public DijkstraMatrix(int n) { a = new int[n + 1][n + 1]; b = new boolean[n + 1]; q = new PriorityQueue<int[]>(n + 1, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[1] - o2[1]; } }); } public void set(int i, int j, int cost) { a[i][j] = cost; } public int getCost(int s, int e) { Arrays.fill(b, false); q.clear(); b[s] = true; for (int i = 1; i < a.length; ++i) if (a[s][i] > 0) q.add(new int[] { i, a[s][i] }); int c = 0; while (!q.isEmpty()) { int[] t = q.poll(); if (t[0] == e) { c = t[1]; break; } b[t[0]] = true; for (int i = 1; i < a.length; ++i) if (!b[i] && a[t[0]][i] > 0) q.add(new int[] { i, t[1] + a[t[0]][i] }); } return c; } }
使い方(SPOJ3700 EZDIJKST)
public static void main(String[] args) throws Exception{ for(int t=next();t-->0;){ DijkstraMatrix dijkst=new DijkstraMatrix(next()); for(int k=next();k-->0;){ int i=next(); int j=next(); int cost=next(); dijkst.set(i, j, cost); } int start = next(); int end = next(); int cost = dijkst.getCost(start, end); System.out.println(cost<1?"NO":cost); } }