最短路径 Dijkstra

OSPF 链路状态协议的一种常用的路由方法,是一种贪心的策略,采用 广度优先遍历的思想。

时间复杂度O(N^2);如果使用堆优化是:???

主要的数据结构:

数组 dis[N] : 保存源点到各个顶点的最短距离;只一个,不需要每个点都维护。

集合 T: 保存已经找到最短路径的定点的集合。

初始化,源点s dis[s]=0,T={s}; 

对于集合T 里节点的可达的节点m,dis[m]=D(s,m);不可达的节点n,dis[n]无穷大;

find min{dis[]} ,该值为最短路径 加入T,成功加入一个节点;

然后重复找T能达到的所有节点,更新 dis[],找到dis[]中的min,加入 T;

循环,直至所有的节点都加入T;

本例是有向图,V1->V2是不可达的 【https://blog.csdn.net/qq_35644234/article/details/60870719】

选择V3加入T集合;

V5加入集合T;

V4加入集合T;


V6加入集合T

public class Dijkstra {
	private static int N = 1000;// graph 和N 需要使用static 修饰
	private static int[][] graph = { 
		{ 0, 1, 5, N, N, N, N, N, N },
        { 1, 0, 3, 7, 5, N, N, N, N },
        { 5, 3, 0, N, 1, 7, N, N, N },
        { N, 7, N, 0, 2, N, 3, N, N },
        { N, 5, 1, 2, 0, 3, 6, 9, N },
        { N, N, 7, N, 3, 0, N, 5, N },
        { N, N, N, 3, 6, N, 0, 2, 7 },
        { N, N, N, N, 9, 5, 2, 0, 4 },
        { N, N, N, N, N, N, 7, 4, 0 } };
	
	public static void main(String[] args){  
	     int k = 2; dijkstra(k,graph);//找到k节点到各个顶点的最短路径  
	}
	public static void dijkstra(int k,int[][]graph){
		int len = graph.length;
		int[] dis = new int[len];//最短距离数组
		int[] pre = new int[len];//前驱节点数组
		boolean[] find = new boolean[len];//标记节点是否被访问过,也就是是否把本节点放入已访问集合中		
		for(int i = 0;i<len;i++){   //初始化
			pre[i]=i;find[i] = false;
			dis[i]=graph[k][i];
		}
		find[k]=true;int least = 0;//least节点被更新为数组中dis最小的点
		for(int i = 0;i<len;i++){
			int min =N;//注意min的初始化位置,每选一次节点进入已访问集合,就需要初始化一次min
			for(int j =0;j<len;j++){
				if(find[j]==false && dis[j]<min){
					min = dis[j];//找到本轮数组dis[]的min
					least = j;
				}
			}
			find[least] = true;
			//根据目前新加入的least节点 来更新dis[]数组
			for(int j = 0;j<len;j++){
				if(find[j]==false && (min+graph[least][j]) < dis[j]){
					dis[j] =  min+graph[least][j] ; 
					pre[j] = least;
				}
			}
		}
		for(int i =0;i<len;i++){
			System.out.println(k+"--->"+i+"距离为"+dis[i]+"and prenode is"+pre[i]);
		}
	}
}
2--->0距离为4and prenode is1
2--->1距离为3and prenode is1
2--->2距离为0and prenode is2
2--->3距离为3and prenode is4
2--->4距离为1and prenode is4
2--->5距离为4and prenode is4
2--->6距离为6and prenode is3
2--->7距离为8and prenode is6
2--->8距离为12and prenode is7

【dijkstra算法java:https://www.cnblogs.com/zengzhihua/p/6755439.html】


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值