老张的路

利用最小生成树找到能够遍历全部节点的最短路径

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("data.txt")));
        String[] inputs = br.readLine().trim().split(" ");
        int n = Integer.parseInt(inputs[0]);
        int m = Integer.parseInt(inputs[1]);
        int[][] edge = new int[n + 1][n + 1];

        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= n; j++) {
                edge[i][j] = -1;
            }
        }
        String[] us = br.readLine().trim().split(" ");
        String[] vs = br.readLine().trim().split(" ");
        String[] ws = br.readLine().trim().split(" ");

        for (int i = 0; i < m; i++) {
            int u = Integer.parseInt(us[i]);
            int v = Integer.parseInt(vs[i]);
            int len = Integer.parseInt(ws[i]);
            edge[u][v] = len;
            edge[v][u] = len;
        }

        Map<Integer, Integer> mp = new HashMap<>(); // 用来记录已访问的节点
        List<Integer> vt = new ArrayList<>(); // 访问顺序

        // 从第一个节点开始
        mp.put(1, 1);
        vt.add(1);

        long ans = 0;
        int minLen;
        int node;
        for (int i = 0; i < n - 1; i++) { // 总共有n-1条边
            minLen = Integer.MAX_VALUE;
            node = -1;
            for (int cur : vt) { // 选择离选点最近的点
                for (int k = 1; k <= n; k++) { // 在 1 - n 中查找节点
                    if (mp.containsKey(k)) continue; // 跳过已选择的点
                    if (edge[cur][k] == -1) continue; // 无边
                    // 找到最小的边
                    if (edge[cur][k] < minLen) {
                        node = k;
                        minLen = edge[cur][k];
                    }
                }
            }
            ans += minLen;
            mp.put(node, 1); // 标记为已选择
            vt.add(node);
        }
        System.out.println(ans);
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 算法应用 指定一个起点,得到该起点到图的其他所有节点的最短路径 核心思想 Dijkstra算法是一种动态规划算法,...
    刻苦驴哝阅读 13,292评论 0 12
  • 大部分内容来自于《大话数据结构》,代码全部使用Swift实现。至于为什么抽风写这个?😊你懂的。 1.线性表 线性表...
    一剑孤城阅读 81,981评论 12 111
  • 图论 无权图 交通运输,社交网络,互联网,工作的安排,闹区活动等等都可以用到图论处理。图可以分成两大类,一类是无向...
    冒绿光的盒子阅读 3,655评论 0 1
  • 1.图的基本概念 图由有限顶点集V和有限边(弧)集E组成,顶点集不可为空,边(弧)集可为空 有向图:E是有向边(即...
    WilsonEdwards阅读 5,600评论 0 1
  • 最短路径算法在现实生活中也具有非常多的应用,例如在一个复杂的景区,想要从一个景点到另外一个景点,利用最短路径算法就...
    郑明明阅读 5,790评论 0 6