Diskstra-最短路径-使用数组来实现邻接表
2018-03-23 15:53
316 查看
单元最短路径算法-dijstra算法使用的是邻接矩阵实现
起始点u[],终点v[],使用矩阵e[][]表示起始点和终点的权值即路径长
从起始点为中心向外扩展到其余个点的路程:
1)用dis初始值为起始点到所有顶点的距离,不能直接到达的先用正无穷表示
2)用book[i]记录已经确认是起始点到i点的最短路径的确认点,book[]初始值设置为0,确认后book[i]设置为1
a.确认dis数组中与初始值最短的路径的顶点i,并将i点放入book中;
b.然后以i点对剩余dis中的各个点进行松弛,若dis[k]>dis[i]+e[i][k],那么更新dis[k]=dis[i]+e[i][k]
接着确认下一个没有被book标记的(book[]=0)的确认值--------即重复a.b.步骤
这个算法的复杂度为O(N*N)
使用邻接表则可以将时间复杂度降到O(M+N)logN
--------------------------------------------------------
首先 邻接矩阵是用两个一维数组来储存的:first[] 和 next[]、起始点终点和权值用一维数组u[]、v[]、w[]表示
first[]的各个点保存的是该点的第一条边的编号 例如first[1]=5表示u[]=1的第一条边的位置在5号
next[]保存第二条边以及往后的边的位置 next[5]=3表示编号为5位置的边下一条边的编号位置是3号
//初始化first和next数组
for(int i=1;i<=n;i++)//n为顶点数目
first[i]=-1;
for(int i=1;i<=m;i++)//m为总边数
{
next[i]=first[u[i]];//放在前面是因为防止重复出现多次相同起始点 而被覆盖,利用边的编号是唯一的,next[i]表示i编号的边下一条指向哪一条边
first[u[i]]=i;//顶点u[i]在哪条边
}这样就可以将所有的顶点和边按照图上的形式存储起来
那么如何读出所有的边呢?
首先遍历first[],这里存储着所有的顶点,以及该顶点对应的第一条边的编号for(int i=1;i<=n;i++)
{
k=first[i];//访问该点的第一条边
while(k!=-1)//因存在没有该顶点的表,和已经遍历到尽头的结点
{
print("");//打印出该节点
k=next[k];//访问该点的下一条边
}
}完成了!!这个为学习笔记,等有空了再把完整代码附上~
起始点u[],终点v[],使用矩阵e[][]表示起始点和终点的权值即路径长
从起始点为中心向外扩展到其余个点的路程:
1)用dis初始值为起始点到所有顶点的距离,不能直接到达的先用正无穷表示
2)用book[i]记录已经确认是起始点到i点的最短路径的确认点,book[]初始值设置为0,确认后book[i]设置为1
a.确认dis数组中与初始值最短的路径的顶点i,并将i点放入book中;
b.然后以i点对剩余dis中的各个点进行松弛,若dis[k]>dis[i]+e[i][k],那么更新dis[k]=dis[i]+e[i][k]
接着确认下一个没有被book标记的(book[]=0)的确认值--------即重复a.b.步骤
这个算法的复杂度为O(N*N)
使用邻接表则可以将时间复杂度降到O(M+N)logN
--------------------------------------------------------
首先 邻接矩阵是用两个一维数组来储存的:first[] 和 next[]、起始点终点和权值用一维数组u[]、v[]、w[]表示
first[]的各个点保存的是该点的第一条边的编号 例如first[1]=5表示u[]=1的第一条边的位置在5号
next[]保存第二条边以及往后的边的位置 next[5]=3表示编号为5位置的边下一条边的编号位置是3号
//初始化first和next数组
for(int i=1;i<=n;i++)//n为顶点数目
first[i]=-1;
for(int i=1;i<=m;i++)//m为总边数
{
next[i]=first[u[i]];//放在前面是因为防止重复出现多次相同起始点 而被覆盖,利用边的编号是唯一的,next[i]表示i编号的边下一条指向哪一条边
first[u[i]]=i;//顶点u[i]在哪条边
}这样就可以将所有的顶点和边按照图上的形式存储起来
那么如何读出所有的边呢?
首先遍历first[],这里存储着所有的顶点,以及该顶点对应的第一条边的编号for(int i=1;i<=n;i++)
{
k=first[i];//访问该点的第一条边
while(k!=-1)//因存在没有该顶点的表,和已经遍历到尽头的结点
{
print("");//打印出该节点
k=next[k];//访问该点的下一条边
}
}完成了!!这个为学习笔记,等有空了再把完整代码附上~
相关文章推荐
- 有向图中Dijstra最短路径算法的邻接表实现
- 队列优化并使用邻接表存储的Bellman-Ford算法模板解决最短路径存在负权边问题
- 邻接表实现 单源最短路径SPFA算法 poj1511
- 【算法】Dijkstra算法(单源最短路径问题) 邻接矩阵和邻接表实现
- 邻接表实现 单源最短路径SPFA算法
- Codeforces Round #287 (Div. 2) E bfs+记录最短路径(邻接表的使用
- 利用邻接表求解所有节点的最短路径 java实现 可运行
- 邻接表实现Dijkstra最短路径算法
- 用邻接表实现图的深度优先遍历、广度优先遍历、最短路径(无权图)
- Python使用Dijkstra算法实现求解图中最短路径距离问题详解
- 使用pgrouting和geotools实现最短路径,服务区分析
- 图(有向图)的邻接表表示 C++实现(遍历,拓扑排序,最短路径,最小生成树) Implement of digraph and undigraph using adjacency list
- 邻接表实现,单源最短路径
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
- Dijkstra算法 求单源含权最短路径(邻接表有向图)C实现
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
- 九度 OJ 1447 题 最短路径问题 Dijkstra(迪杰斯特拉)算法实现,使用vector模板模拟邻接链表
- 图的邻接表实现迪杰斯特拉算法求最短路径
- 算法-dijkstra求最短路径(邻接表实现)
- SQLServer-存储过程中使用字符串和分隔符实现传递数组参数