关于最短路径

##关于最短路径的解法
第一次接触到最短路径问题是在完成数据结构大作业时,在大作业答辩时听到同学们用到的是Dijkstra算法(迪杰斯特拉)回去了解了一下这个算法在这里不再解释。在数据学习时我们学习了深度遍历算法来遍历图,我们也可以用深度遍历算法来解决最短路径问题。
##深度遍历算法
要使用深度遍历来解决最短路径问题首先要理解深度遍历算法(这里我们说邻接表的深度遍历),深度遍历算法简单的说就是根据邻接表遍历从始点到终点的所有路径(其中需要注意的是递归的使用和访问标记数组的赋值问题)
##开始利用深度遍历算法解决最短路径问题
我们需要在深度遍历算法的基础上做一下简单的判定和初始化工作(这里假如说只有十个顶点)(邻接表用all
g表示,暂时保存路径的数组luj[10],访问标记数组f[10],保存所有路径的数组av[30][30],记录一条路径的节点数的整形变量k,和记录总共有多少条路径的整形数组k1,整形变量sum(用于暂时保存一条路径的长度)),下面是代码的具体实现(只是有关深度遍历计算最短路径的相关代码段):

#include<stdio.h>
#include<malloc.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
int f[10],k=-1,k1=0,av[30][10],luj[10],v[10][10],d1[30],sum;
void dfs(all*g,int a,int c,int k)
{
 int i,j,w;
 bian*q;//邻接表的边结点 
 k++;
 luj[k]=a;
 f[a]=1;
 if(a==c&&k>=0)
 {
  for(i=0;i<=k;i++)
  {
   av[k1][i]=luj[i];
  }
  sum=0;
  for(j=0;j<k;j++)
  {
   sum+=v[luj[j]][luj[j+1]];
  }
  d1[k1]=sum;
  k1++;
 }
 q=g->t[a].first;//邻接表内容更具实际问题建立 
 while(q!=NULL)
 {
  w=q->data;
  if(f[w]==0)
  {
   dfs(g,w,c,k);
  }
  q=q->next;
 }
 f[a]=0;
}
  dfs(g,a,c,k);//a表示起点,c表示终点,由用户输入 
  temp=d1[0],j=0;
  for(i=0;d1[i]!=-1;i++)
  {
   if(d1[i]<temp)
   {
    temp=d1[i];
    j=i;
   }
  }
  cout<<"最短路径为:";
  for(i=0;av[j][i+1]!=-1;i++)
  {
   cout<<b[av[j][i]].name<<"->";
  }
  cout<<b[av[j][i]].name<<endl; 
  cout<<"最短路径长度为:";
  cout<<temp<<endl;
  memset(av,-1,sizeof(av));
  memset(d1,-1,sizeof(d1));
  k=-1;
  k1=0;
  memset(luj,-1,sizeof(luj));
  memset(f,0,sizeof(f));//这里的初始化工作是利于重复查询最短路径 

代码可能不是很清楚因为有些代码块涉及其它东西粘出来太多。它的总体思想就是利用深度遍历算法找到一条路径就把这条路径和路径的长度保存下来深度遍历结束后(找到了所有路径)在路径长度数组里面找到最小值再输出相应的路径。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值