Dijkstra_最短路

来源:互联网 发布:c语言产生随机数代码 编辑:程序博客网 时间:2024/06/05 19:23
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;class vertex {int v, w;vertex next;public vertex() {}public vertex(int v, int w) {this.v = v;this.w = w;}}public class Dijkstra {static int n, m;static int INF = Integer.MAX_VALUE;static int[][] vexw;public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String order[] = br.readLine().split(" ");n = Integer.parseInt(order[0]);m = Integer.parseInt(order[1]);// 创建一个邻接表vertex[] vss = new vertex[n + 1];for (int i = 1; i < vss.length; i++)vss[i] = new vertex();// 创建一个邻接矩阵vexw = new int[n + 1][n + 1];for (int i = 1; i < n + 1; i++)for (int j = 2; j < n + 1; j++)vexw[i][j] = (i != j) ? INF : 0;for (int i = 0; i < m; i++) {String data[] = br.readLine().split(" ");int u = Integer.parseInt(data[0]);int v = Integer.parseInt(data[1]);int w = Integer.parseInt(data[2]);vexw[u][v] = w;vexw[v][u] = vexw[u][v];vertex vo = vss[u];while (vo.next != null)vo = vo.next;vo.next = new vertex(v, w);vertex vt = vss[v];while (vt.next != null)vt = vt.next;vt.next = new vertex(u, w);}int prev[] = new int[n + 1];// 存放顶点int dist[] = new int[n + 1];// 存放最短路值int[] result = new int[n + 1];for (int i = 2; i < result.length; i++)result[i] = INF;dijkstra_v(1, prev, result, vss);dijkstra_m(1, prev, dist);// 1是起始顶点}// 邻接表public static void dijkstra_v(int vs, int prev[], int dist[], vertex[] vss) {boolean flag[] = new boolean[n + 1];vertex vertex = vss[vs].next;while (vertex != null) {dist[vertex.v] = vertex.w;vertex = vertex.next;}flag[vs] = true;dist[vs] = 0;int k = 1;for (int i = 2; i < n + 1; i++) {//获取当前dist里最小值int min = INF;for (int j = 1; j < n + 1; j++) {if (!flag[j] && dist[j] < min) {min = dist[j];k = j;}}flag[k] = true;//更新vertex vex = vss[k].next;while (vex != null) {int v = vex.v, w = vex.w;if (!flag[v] && (min + w) < dist[v]) {dist[v] = min + w;prev[v] = k;}vex = vex.next;}}System.out.print("dijkstra-v:");for (int i = 2; i < dist.length; i++) {System.out.print(dist[i] + " ");}System.out.println();}// 邻接矩阵public static void dijkstra_m(int vs, int prev[], int dist[]) {boolean flag[] = new boolean[n + 1];for (int i = 1; i < dist.length; i++)dist[i] = vexw[vs][i];flag[vs] = true;dist[vs] = 0;int k = 1;for (int i = 2; i < n + 1; i++) {// 找出当前组最小的,用k记录下标int min = INF;for (int j = 1; j < n + 1; j++) {if (!flag[j] && dist[j] < min) {min = dist[j];k = j;}}flag[k] = true;// 标记到达顶点k的最短路径已经找到// 更新for (int j = 1; j < n + 1; j++) {int tmp = (vexw[k][j] == INF ? INF : (min + vexw[k][j]));if (!flag[j] && (tmp < dist[j])) {dist[j] = tmp;prev[j] = k;}}}System.out.print("dijkstra-m:");for (int i = 2; i < dist.length; i++) {System.out.print(dist[i] + " ");}}}

0 0