Dijkstra算法 java

---恢复内容开始---

Dijkstra算法主要是用来找出图中一点到另一点的最短路径。思路是,从出发点开始,更新出发点的邻接点距离(从初始的无穷大更新为出发点到邻节点边的权重),找出距离最小的顶点,更新该顶点的邻接点到出发点的距离,完毕之后再找出未被访问过的刀出发点距离最短的顶点,进行之前的操作。这样,当所以顶点都被访问过之后,储存距离的数组中储存的就是出发点到各顶点的最小距离了。看下面这个例子:

如果要找出0到4的最短距离,一下子找出来还是比较困难的,这时用Dijkstra算法就很方便了。

class test
{
    public static void main(String[] args) 
    {
        int M=10000;
        int[][] graph = {  
                {0,10,M,30,100},  
                {M,0,50,M,M},  
                {M,M,0,M,10},  
                {M,M,20,0,60},  
                {M,M,M,M,0}  
                };
        int start=0;
        dijkstra(graph,0);
    }    
    public static void dijkstra(int[][] arr,int start)
    {
        int num=arr.length;//顶点个数
        boolean[] visited=new boolean[num];//标记顶点是否最终处理
        int[] dist=new int[num];//出发点到顶点的当前最短距离
        //初始化
        for (int i=0;i<num ;i++ )
        {
            visited[i]=false;
            dist[i]=10000;
        }
        //预处理出发点
        dist[start]=0;
        visited[start]=true;
        //预处理出发点,更新出发点的邻接点的距离
        for (int i=0;i<num ;i++ )
        {
            if (arr[start][i]<dist[i]&&visited[i]==false)
                    dist[i]=arr[start][i];
                    
        }
        //开始循环
        while (true)
        {
            //当没有未标记的点时跳出循环
            int min=10000;
            int index=10000;
            for (int i=0;i<dist.length ; i++)
            {
                if (dist[i]<min&&visited[i]==false)
                {
                    min=dist[i];
                    index=i;
                }
            }
            //int index=findmin(dist);
            if (index==10000)
            {
                break;
            }
            visited[index]=true;

            for (int i=0;i<num ; i++)
            {
                if (visited[i]==false&&arr[index][i]<10000)
                {
                    if (dist[i]>dist[index]+arr[index][i])
                        dist[i]=dist[index]+arr[index][i];
                    
                }
            }
        }
        for (int i=0;i<num ;i++ )
        {
            System.out.println("从"+start+"到"+i+"的最短距离是"+dist[i]);
        }
    }
}

打印结果

猜你喜欢

转载自www.cnblogs.com/javaStudy947/p/9118915.html