对于单源最短路径问题,可以利用贪心策略求解,其经典算法便是Dijkstra算法。首先找出与v0点最邻近点的最短路径,然后找出与v0点第二近顶点的最短路径,直到找到最后一个点与v0的最短路径。
实现Dijkstra算法可以和prim算法类似,需要构造2个集合s1,s2。其中s1是当前搜索到的最短路径顶点集,s2是剩下的带求解的点集。每一次搜索都会将s2中的点与最后加入到s1的点进行权值更新操作,一旦发现有s1到s2的更短的路径,就更新目前的距离集合,并且将最短距离对应的那个点加入到s1中,并从s2中删除。
Dijkstra算法的时间复杂度是O(n^2)。
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* 单源最短路径的Dijkstra算法实现
* @author ql_math
*
*/
public class DijkstraShortestPath {
/**最短路径的连接*/
private double[] shortestPathArray;
private int pointsNum;
/**
* Dijkstra算法计算单源最短路径
* @param pIndex
* @param graphicArray
* @return
*/
public double[] calculateShortestPath(int pIndex, double[][] graphicArray)
{
SimpleGraphics graph=new SimpleGraphics(graphicArray);
pointsNum=graph.getPSize();//顶点数目
List<Integer> curFoundList=new LinkedList<Integer>();//当前找到的点集合
curFoundList.add(pIndex);
List<Integer> midList=new LinkedList<Integer>();//待查找点集
shortestPathArray=new double[pointsNum];//获得与当前点连接的点集合
initShortestPath(midList,pIndex);//待查找点集
int set_num=1;
while(set_num<=pointsNum)
{
int cur_shortest_index=calculateP2PShortestPath(graph,curFoundList,midList);//找出与当前点连接的点距最小值的点
curFoundList.add(cur_shortest_index);
midList.remove(new Integer(cur_shortest_index));
set_num++;
}
return shortestPathArray;
}
private int calculateP2PShortestPath(SimpleGraphics graph, List<Integer> curFoundList, List<Integer> midList) {
int compareNode=((LinkedList<Integer>)curFoundList).getLast();
double[] array=graph.getAdjacencyPoints(compareNode);
double min=Double.MAX_VALUE;
int index=0;
for(int i=0;i<pointsNum;i++)
{
double newLen=shortestPathArray[compareNode]+array[i];
if(newLen<shortestPathArray[i]&&midList.contains(i))
shortestPathArray[i]=newLen;
}
for(int i=0;i<pointsNum;i++)
{
if(shortestPathArray[i]<min&&midList.contains(i))
{
index=i;
min=shortestPathArray[i];
}
}
return index;
}
/**
* 初始化
* @param n
* @param index
*/
private void initShortestPath(List<Integer> list, int index) {
for(int i=0;i<pointsNum;i++)
{
if(i!=index)
{
list.add(i);
shortestPathArray[i]=Double.MAX_VALUE;
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
DijkstraShortestPath dj=new DijkstraShortestPath();
double[][] graphicArray={{0,1,6,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE},
{1,0,3,4,6,Double.MAX_VALUE},{6,3,0,2,2,Double.MAX_VALUE},
{Double.MAX_VALUE,4,2,0,2,3},{Double.MAX_VALUE,6,2,2,0,4},{Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,3,4,0}};
System.out.println("最短路径:"+Arrays.toString(dj.calculateShortestPath(0,graphicArray)));
}
}
分享到:
相关推荐
本资源是关于基于贪心法求解单源最短路径问题的实验报告,包括实验内容、算法设计、算法描述、算法正确性证明、算法分析、算法实现与测试等部分。 实验目的:理解贪心法的核心思想、贪心法的求解过程,并从算法分析...
Dijkstra算法是一种贪心算法,用于解决单源最短路径问题。其基本思想是将图中所有顶点分成两组:S和V-S,其中S是包括已确定最短路径的顶点的集合,V-S是尚未确定的最短路径的顶点集。初始时,S仅包含源v0,不断在V-S...
用C++实现的贪心算法 Dijkstra 单源最短路径,并包含大量的注释,对理解程序很有帮助
Dijkstra算法的核心思想是贪心策略,它每次选择当前未访问顶点中距离起点最近的一个,并更新与它相邻的顶点的距离。 源代码实现通常包括以下关键步骤: 1. 初始化:设置一个起点,将所有顶点的距离初始化为无穷大...
Dijkstra算法是最常用的求解单源最短路径的贪心算法之一,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出。这个算法适用于加权有向图或无向图,其基本思想是每次扩展最短路径树,将当前未访问且与已访问节点距离...
本设计以VC++6.0作为程序开发环境,C语言作为程序开发语言,详细介绍了最短路径的求解算法及其...请用C/C++语言的结构体、指针、数据结构等基础知识,编写程序实现图的结构定义、图的存储,以及求解单源点最短路径。
它使用贪心策略,每次选取当前未访问节点中最短路径的节点进行扩展,直到到达目标节点或遍历完所有节点。Dijkstra算法保证找到的路径是全局最优的,但不能处理负权边。 2. **Bellman-Ford算法**:由理查德·贝尔曼...
这个C程序展示了如何利用Dijkstra算法求解单源点最短路径问题,但需要注意的是,该算法并不适用于存在负权重边的图,因为贪心策略在这种情况下可能无法得到全局最优解。对于存在负权重的图,可以考虑使用其他算法,...
在计算机科学领域,尤其是图论和算法设计中,求解单源最短路径问题是一项基本任务。这通常涉及在一个加权图中找到从一个特定顶点(源节点)到所有其他顶点的最短路径。这个问题在路由、物流、网络优化等实际场景中有...
总结来说,Dijkstra算法是一种用于求解单源最短路径问题的有效方法,它通过贪心策略逐步扩展最短路径,适用于无负权边的图。在实际编程实现中,需要考虑优化数据结构以提高效率,如使用优先队列。理解并熟练运用...
### 单源最短路径算法实现 #### 一、引言 在计算机科学与图论领域,单源最短路径问题是指在一个加权图中找到从一个特定顶点(源点)到所有其他顶点的最短路径的问题。这类问题在实际应用中非常常见,例如在地图导航...
总的来说,Dijkstra算法是一种高效的求解单源最短路径问题的方法。在处理大型网络数据时,如欧洲铁路系统,它能快速找出两点间最经济的旅行路线。理解并掌握这种算法,对于解决现实世界中的许多问题都至关重要。
Dijkstra算法是图论中应用最广的算法之一,广泛应用于解决最短路径问题。在该算法中,我们可以将问题转换为图论问题,然后使用Dijkstra算法来求解。该算法的基本思路是按照源点s到其他各个顶点的最短路径的递增顺序...
"单源最短路径—Dijkstra算法实验报告" 本实验报告的目的是为了了解贪心算法的基本要素,掌握Dijkstra...本实验通过了Dijkstra算法实现单源最短路径的求解,掌握了贪心算法的基本要素,了解了单源最短路径问题的思想。
- 实现`Dijkstra`函数,该函数采用贪心策略逐步构建最短路径树。 - 编写辅助函数,如`ppath`用于打印路径等。 - 主函数中读取用户输入的图信息,并调用`Dijkstra`函数计算最短路径。 3. **测试阶段**:编写测试...
1. **Dijkstra算法**:由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,是最著名的单源最短路径算法之一。它通过贪心策略,每次选取当前未访问节点中最短路径的节点进行扩展,直到找到所有节点的最短路径。...
Dijkstra算法的核心思想是贪心策略,即每次都选取当前未处理节点中距离起点最近的一个节点,将其最短路径确定下来,并根据这个节点更新与其相邻节点的最短路径。这个过程持续进行,直到所有的节点都被处理,最终得到...
另外,"最短路径(单源dijkstra+binary_heap正向表.txt"和"最短路径(单源dijkstra邻接阵形式).txt"则可能包含Dijkstra算法与二叉堆的实现,二叉堆是另一种常用的优先队列实现方式,常见于标准库中。 2. Floyd-...
3. **Dijkstra算法**:Dijkstra算法是最常用的解决单源最短路径问题的算法,由Edsger W. Dijkstra提出。它通过维护一个优先队列,逐步找到从源点到各个顶点的最短路径。每次从队列中取出距离源点最近的顶点,并更新...