第五周作业——Dijkstra算法的实现

来源:互联网 发布:电话变声软件 编辑:程序博客网 时间:2024/06/06 04:50
package progrem;import java.io.BufferedReader;import java.io.FileReader;public class Dijkstra {public static int Max = 1000;public float cost[][];//邻接矩阵public int vertexNum;//定点数public int weight;//权重public static void main(String []args){Dijkstra dj = new Dijkstra();dj.InitEdge();dj.dijkstra(0);}public void InitEdge(){//初始化try{String readStr = null;String storeStr[];int firstAdj;//起始顶点int endAdj;//终点float weight;FileReader fr = new FileReader("C:/Users/Y470/Desktop/tinyEWD.txt");BufferedReader br = new BufferedReader(fr);storeStr = new String[3];readStr = br.readLine().trim();storeStr = readStr.split(" ");vertexNum = Integer.parseInt(storeStr[0]);//初始化顶点数cost = new float[vertexNum][vertexNum];for(int x=0;x<vertexNum;x++){//初始化邻接矩阵for(int y=0;y<vertexNum;y++){cost[x][y] = Max;}}readStr = br.readLine().trim();while(readStr != null){storeStr = readStr.split(" ");firstAdj = Integer.parseInt(storeStr[0]);endAdj = Integer.parseInt(storeStr[1]);weight = Float.parseFloat(storeStr[2]);cost[firstAdj][endAdj] = weight;//按读取到的值依次给邻接矩阵赋值readStr = br.readLine();}br.close();}catch(Exception e){e.printStackTrace();}}public void dijkstra(int v){float []dist = new float[vertexNum];//存放到原点的最小距离int []s = new int[vertexNum];//源点集合即 s 集合int []rear = new int[vertexNum];int [][]q = new int[vertexNum][vertexNum];//到 i 顶点 的最短距离路径存放在队列去[i],队头指针为0,对为指针为存储在rear[]中。int i,j,k,m;float win;for(i=1;i<vertexNum;i++){//初始化s和rears[i] = 0;rear[i] = -1;}for(i=1;i<vertexNum;i++){dist[i] = cost[v][i];if(dist[i]<Max){q[i][++rear[i]] = v;q[i][++rear[i]] = i;}}s[v] = 1; //v顶点进入集合for(k=0;k<vertexNum-1;k++){//并入n-1个顶点即是求n-1条最短路径win = Max;j = v;for(i=1;i<vertexNum;i++){if(s[i] ==0 && dist[i]<win){j = i;win = dist[i];}}if(j!=i){s[j] = 1;System.out.print("源点"+v+"到顶点顶点"+j+"的最短距离是:"+dist[j]+"  经过的定点有:");for(i=0;i<=rear[j];i++){System.out.print(q[j][i]+" ");}System.out.println();for(i=1;i<vertexNum;i++){if(s[i] ==0 && ((dist[j]+cost[j][i])<dist[i])){//修改从原点经过j到i 比原来的短时要修改dist[i] = dist[j] + cost[j][i];for(m=0;m<=rear[j];m++){q[i][m] = q[j][m];}rear[i] = rear[j];q[i][++rear[i]] = i;}}}}}}

0 0
原创粉丝点击