图的最短路径(dijkstra算法/floyd算法)

来源:互联网 发布:ubuntu15.10安装mysql 编辑:程序博客网 时间:2024/05/22 14:30
//笛基斯特拉    public static int  Dijkstra(int[][] matrix,int m, int v0,int v1) {        int MAXINT = 9999;        int MAXNUM = m+1;        int dist[] = new int[MAXNUM];    //距离        int prev[] = new int[MAXNUM];   //前趋节点        boolean S[] = new boolean[MAXNUM];             // 判断是否已存入该点到S集合中        int n = m;        //初始化        for (int i = 0; i <= n; ++i) {            dist[i] = matrix[v0][i];            S[i] = false;                              // 初始都未用过该点            if (dist[i] == MAXINT)                prev[i] = -1;            else                prev[i] = v0;        }        //从第v0点开始        dist[v0] = 0;        S[v0] = true;        for (int i = 1; i <= n; i++) {            int mindist = MAXINT;            int u = v0;            // 找出当前未使用的点j的dist[j]最小值            for (int j = 0; j <= n; ++j) {                if ((!S[j]) && dist[j] < mindist) {                    u = j;                             // u保存当前邻接点中距离最小的点的号码                    mindist = dist[j];                }                S[u] = true;            }            //更新各节点的距离            for (int j = 0; j <= n; j++) {                if ((!S[j]) && matrix[u][j] < MAXINT) {                    if (dist[u] + matrix[u][j] < dist[j]) {   //在通过新加入的u点路径找到离v0点更短的路径                        dist[j] = dist[u] + matrix[u][j];    //更新dist                        prev[j] = u;                    //记录前驱顶点                    }                }            }        }        for (int j = 0; j <= n; j++) {            System.out.print(dist[j]+",");            System.out.print(prev[j]+",");        }        System.out.println();        return dist[v1];    }    //动态规划,floyd算法    public static int dynam(int[][] matrix,int m, int v0,int v1) {        int path[][] = new int[m+1][m+1];        int A[][] = new int[m+1][m+1];        int i,j,k;        for(i =0;i<=m;i++){            for(j = 0;j<=m;j++){                A[i][j] = matrix[i][j];                path[i][j] = i;            }        }        for(k=0;k<=m;k++){            for(i=0;i<=m;i++){                for(j=0;j<=m;j++){                    if(A[i][j]>A[i][k]+A[k][j]){                        A[i][j] = A[i][k]+A[k][j];                        path[i][j] = k;                    }                }            }        }        return A[v0][v1];    }

0 0
原创粉丝点击