Diskstra-最短路径-使用数组来实现邻接表

单元最短路径算法-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];//访问该点的下一条边
  }
}
完成了!!这个为学习笔记,等有空了再把完整代码附上~



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值