您的位置:首页 > 其它

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];//访问该点的下一条边
}
}完成了!!这个为学习笔记,等有空了再把完整代码附上~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法
相关文章推荐