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】