最短路径Java代码

本文介绍了一个使用Dijkstra算法寻找图中从起点到各点最短路径的Java实现。通过创建邻接矩阵和迭代操作,算法能够找到并打印出每个点的最短路径及其距离。

最短路径Dijkstra的思想我就不写了,大家自己在网上看吧。我直接上代码了。 

 

public static void main(String[] args) {
        System.out.println("请输入节点数");
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();

        // 创建一个领结矩阵数组
        int[][] arr = makeArr(count);

        // 创建三个数组并且初始化
        List<Integer> s = new ArrayList<>();
        s.add(0);

        int[] v = new int[count - 1];
        for (int i = 1; i < count; i++) {
            v[i - 1] = i;
        }

        int[] dist = new int[count];
        dist[0] = 0;
        for (int i = 1; i < count; i++) {
            dist[i] = -1;
        }
        
        //创建一个字符数组存放点
        String[] dit = new String[] {"B","C","D","E","F","G","H","L"};
        
        //创建一个字符数组来保存路径
        String[] path = new String[count];
        path[0] = "A";

        String[] p = function(s, v, arr, dist, 0, dit, path);
        
        for(int i = 1; i < p.length ; i++) {
            System.out.println(p[i]);
        }
        
    }

        // 迭代操作,i代表操控哪一行
        public static String[] function(List<Integer> s, int[] v, int[][] arr, int[] dist, int i,String[] dit, String[] path) {
            // 定义两个变量来记录最小值,和所在的列
            int min = 200;
            int row = 0;

            // 取出第i行领结矩阵的值并进行相关操作
            for (int k = 0; k < v.length; k++) {
                if (v[k] != 0) {
                    int j = v[k];
                    
                    //判断交换的
                    if (arr[i][j] <= min && arr[i][j] != 0) {
                        min = arr[i][j];
                        row = j;
                    }
                    
                    int add = dist[i] + arr[i][j];
                    //更新最短路径值
                    if (arr[i][j] != 0 && (add < dist[j] || dist[j] == -1)) {
                        dist[j] = add;
                        //创建路径也会自动更新,奇迹
                        path[j] = path[i]+"-->"+dit[j-1];
                    }            
                }
            }
            
            // 更新两个集合
            s.add(v[row - 1]);
            v[row - 1] = 0;

            //递归操作
            if (s.size() != v.length + 1) {
                function(s, v, arr, dist, row, dit , path);
            }

            //结果路径
            return  paths(path,dist);

        }
        
        //对结果进行处理
        public static String[] paths(String[] path, int [] dist) {
            String[] strPath = new String[path.length];
            for(int i = 0; i< path.length; i++) {
                strPath[i] = ""+path[i]+"   "+dist[i];
            }
            return strPath;
        }
     
        // 创建数组
        public static int[][] makeArr(int count) {
            Scanner sc = new Scanner(System.in);
            //创建一个数组
            int[][] arr = new int[count][count];
            System.out.println("请输入图的边数");
            int bians = sc.nextInt();
            System.out.println("输入边和边长");
            for(int i = 0; i < bians; i++) {
                int x = sc.nextInt()-1;
                int y = sc.nextInt()-1;
                int val = sc.nextInt();
                arr[x][y] = val;
                arr[y][x] = val;
            }
            return arr;

        }
 

实际效果展示

 这就是起始点到其它点的最短路径

 

 

以下是使用 Dijkstra 算法求最短路径Java 代码示例: ```java import java.util.*; public class DijkstraAlgorithm { private int dist[]; private Set<Integer> settled; private PriorityQueue<Node> pq; private int V; List<List<Node> > adj; public DijkstraAlgorithm(int V) { this.V = V; dist = new int[V]; settled = new HashSet<Integer>(); pq = new PriorityQueue<Node>(V, new Node()); } public void dijkstra(List<List<Node> > adj, int src) { this.adj = adj; for (int i = 0; i < V; i++) dist[i] = Integer.MAX_VALUE; pq.add(new Node(src, 0)); dist[src] = 0; while (settled.size() != V) { int u = pq.remove().node; settled.add(u); e_Neighbours(u); } } private void e_Neighbours(int u) { int edgeDistance = -1; int newDistance = -1; for (int i = 0; i < adj.get(u).size(); i++) { Node v = adj.get(u).get(i); if (!settled.contains(v.node)) { edgeDistance = v.cost; newDistance = dist[u] + edgeDistance; if (newDistance < dist[v.node]) dist[v.node] = newDistance; pq.add(new Node(v.node, dist[v.node])); } } } public static void main(String[] args) { int V = 6; int source = 0; List<List<Node> > adj = new ArrayList<List<Node> >(); for (int i = 0; i < V; i++) { List<Node> item = new ArrayList<Node>(); adj.add(item); } adj.get(0).add(new Node(1, 5)); adj.get(0).add(new Node(2, 3)); adj.get(1).add(new Node(3, 6)); adj.get(1).add(new Node(2, 2)); adj.get(2).add(new Node(4, 4)); adj.get(2).add(new Node(5, 2)); adj.get(2).add(new Node(3, 7)); adj.get(3).add(new Node(5, 1)); adj.get(3).add(new Node(4, -1)); adj.get(4).add(new Node(5, -2)); DijkstraAlgorithm dpq = new DijkstraAlgorithm(V); dpq.dijkstra(adj, source); System.out.println("The shortest distance from source node " + source + " to all other nodes:"); for (int i = 0; i < dpq.dist.length; i++) System.out.println("Node " + i + " - Distance: " + dpq.dist[i]); } } class Node implements Comparator<Node> { public int node; public int cost; public Node() {} public Node(int node, int cost) { this.node = node; this.cost = cost; } @Override public int compare(Node node1, Node node2) { if (node1.cost < node2.cost) return -1; if (node1.cost > node2.cost) return 1; return 0; } } ``` 这是一个使用 Dijkstra 算法在带权图中求最短路径Java 代码示例。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值