• Poj 2387 Til the Cows Come Home(Dijkstra 最短路径)


    题目:从节点N到节点1的求最短路径。

    分析:这道题陷阱比较多,首先是输入的数据,第一个是表示路径条数,第二个是表示节点数量,在 这里WA了四次。再有就是多重边,要取最小值。最后就是路径的长度的最大值不是100,而是100001。用Dijkstra求最短路径,感觉 Dijkstra和Prim很像,都是从结点中找到路径最小的一条,然后再做某种更新。Dijkstra是看看源节点通过当前节点能否缩短从源头到其他节 点的路径,而Prim则是通过加入当前节点到生成树,然后更新生成树中的路径数量,再从中找到最小路径。

    package Map;
    
    import java.util.Scanner;
    
    /**
     * Dijkstra最短路径
     */
    public class Poj_2387_Dijkstra {
    
            static int n, m;
            static int MAXV = 2010;
            static int MAX = 100001;
            
            static int map[][] = new int[MAXV][MAXV];
            static boolean vis[] = new boolean[MAXV];
            
            public static int dijksrta(int V) {
                    
                    vis[V] = true;
                    for (int i = 1; i <= n; i++) {
                            int min = MAX;
                            int k = 0;
                            for (int j = 1; j <= n; j++) {
                                    if (!vis[j] && map[V][j] < min) {
                                            min = map[V][j];
                                            k = j;
                                    }
                            }
                            vis[k] = true;
                            for (int j = 1; j <= n; j++) {
                                    if (!vis[j] && min + map[k][j] < map[V][j]) {
                                            map[V][j] = min + map[k][j];
                                    }
                            }
                    }
                    return map[V][1];
            }
    
            public static void main(String args[]) {
                    Scanner sc = new Scanner(System.in);
    
                    m = sc.nextInt();
                    n = sc.nextInt();
    
                    for (int i = 1; i <= n; i++) {
                            for (int j = 1; j <= n; j++) {
                                    map[i][j] = MAX;
                            }
                            map[i][i] = 0;
                    }
                    for (int i = 1; i <= m; i++) {
                            int s = sc.nextInt();
                            int e = sc.nextInt();
                            int val = sc.nextInt();
                            if(map[s][e] > val){   //重边问题,去最小的
                                    map[s][e] = val;
                                    map[e][s] = val;
                            }
                    }
                    System.out.println(dijksrta(n));
            }
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    研究table-cell和overflow
    自己封装jquery的一些方法 链式调用模式
    简单的抖动运动 主要利用offset left 和 setTimeout
    闭包的讲解与简单实用(重新理解)
    操作iframe 的方法与兼容性
    360度全景图片
    数组排序
    怎么让链式调用setTimeout停止
    setInterval 和 setTimeout
    重力碰撞运动的疑惑
  • 原文地址:https://www.cnblogs.com/AndyDai/p/4734090.html
Copyright © 2020-2023  润新知