算法实现-->最短路径Dijksra

来源:互联网 发布:爱上人工智能 编辑:程序博客网 时间:2024/05/22 08:09
import java.util.ArrayList;import java.util.HashMap;import java.util.Hashtable;import java.util.Iterator;import java.util.LinkedList;import java.util.Vector;public class Dijkstra {int[][]weight;//邻接矩阵int count;//节点个数int max=10000;//源节点到各节点的距离初始化为一个最大值Dijkstra(int[][] weight,int count){this.weight=weight;this.count=count;}public void setMax(int max){max=1000;}public static void main(String []args){int max=10000;int [][]weight={{0,2,1,8,max,max,max,max},{2,0,max,6,1,max,max,max},{1,max,0,7,max,max,9,max},{8,6,7,0,5,1,2,max},{max,1,max,5,0,3,max,9},{max,max,max,1,3,0,4,6},{max,max,9,2,max,4,0,3},{max,max,max,max,9,6,3,0}};Dijkstra dij=new Dijkstra(weight,8);dij.setMax(max);dij.execute(0);}public void execute(int snode){ArrayList<Integer> s=new ArrayList<Integer>();///具有永久标号的节点    ArrayList<Integer>allnodes=new ArrayList<Integer>();//所有节点的集合    Vector<String>sss;    LinkedList<String>t;    Hashtable<String,String>tt;    HashMap<String,String>ssss;int [] dist=new int[count];//标号,用来标记snode到各个节点的距离int[]fnode=new int[count];//用来标记某个节点的父节点//初始化for(int i=0;i<count;i++){dist[i]=weight[snode][i];fnode[i]=-1;allnodes.add(i);}allnodes.remove(Integer.valueOf(snode));//s集合的补集s.add(snode);while(true){//i表示Iterator<Integer>it=allnodes.iterator();int distflag=max;int posflag=-1;while(it.hasNext()){ int ntemp=it.next(); for(int node:s){if(dist[node]+weight[ntemp][node]<=dist[ntemp]){dist[ntemp]=dist[node]+weight[ntemp][node];fnode[ntemp]=node;}}if(dist[ntemp]<distflag){distflag=dist[ntemp];posflag=ntemp;}}    allnodes.remove(Integer.valueOf(posflag));    s.add(posflag);    if(allnodes.size()==0){        break;    }        }System.out.println( "Start printing.... ");for(int j=1;j<count;j++){        //计算snode到每个节点的最短距离和路径ArrayList<Integer>temp=new ArrayList<Integer>();int flag=j;   if(fnode[flag]==snode){   temp.add(fnode[j]);   }else{while(fnode[flag]!=snode){ temp.add(fnode[flag]); flag=fnode[flag]; }   } System.out.println(snode+"到节点"+j+"的距离为:"+dist[j]+" ,路径为:");       for(int k=temp.size()-1;k>=0;k--){              System.out.print(temp.get(k)+"-->");              }       System.out.print(j+"");       System.out.println("");}}}

0 0
原创粉丝点击