地杰斯特拉算法
package 地杰斯特拉; import java.util.Scanner; /** * 一个农场有n个landmarks,有t条道路链接,问从编号为1的landmarks到编号为n的最短的距离 * @author Administrator * */ public class Main { private int [][]map;//图的邻接矩阵 private int [] dist;//距离 private boolean flag[]; private int n; private int min; Main(int n,int[][]map) { this.n = n; this.map = map; dist = new int[n+1]; flag = new boolean[n+1]; min = 0; } public static void main(String[] args) { Scanner input = new Scanner(System.in); int t = input.nextInt(); int n = input.nextInt(); int cost,x,y; int [][] map = new int[n+1][n+1]; for(int i = 1;i<=n;i++) { for(int j=1;j<=n;j++) { map[i][j] = Integer.MAX_VALUE; } } for(int j=1;j<=t;j++) { x = input.nextInt(); y = input.nextInt(); cost = input.nextInt(); if(cost < map[x][y]) { map[x][y] = map[y][x] = cost; } } Main ma = new Main(n, map); System.out.println(ma.dijkstra()); } private int dijkstra() { int min_j = 1; flag[1] = true; for(int i=2;i<=n;i++) dist[i] = map[1][i];//存储1到所有顶点的距离 for(int i=2;i<=n;i++)//选一个与顶点1最近的点 { min = Integer.MAX_VALUE; for(int j=1;j<=n;j++) { if(dist[j] < min && !flag[j]){ min = dist[j]; min_j = j; } } flag[min_j] = true; if(min_j == n) { return min; } for(int k=1;k<=n;k++) { if(!flag[k] && map[min_j][k] < Integer.MAX_VALUE) { if(map[min_j][k]+dist[min_j] < dist[k]) { dist[k] = map[min_j][k]+dist[min_j]; } } } } return min; } }
测试数据
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
90