##关于最短路径的解法
第一次接触到最短路径问题是在完成数据结构大作业时,在大作业答辩时听到同学们用到的是Dijkstra算法(迪杰斯特拉)回去了解了一下这个算法在这里不再解释。在数据学习时我们学习了深度遍历算法来遍历图,我们也可以用深度遍历算法来解决最短路径问题。
##深度遍历算法
要使用深度遍历来解决最短路径问题首先要理解深度遍历算法(这里我们说邻接表的深度遍历),深度遍历算法简单的说就是根据邻接表遍历从始点到终点的所有路径(其中需要注意的是递归的使用和访问标记数组的赋值问题)
##开始利用深度遍历算法解决最短路径问题
我们需要在深度遍历算法的基础上做一下简单的判定和初始化工作(这里假如说只有十个顶点)(邻接表用allg表示,暂时保存路径的数组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));//这里的初始化工作是利于重复查询最短路径
代码可能不是很清楚因为有些代码块涉及其它东西粘出来太多。它的总体思想就是利用深度遍历算法找到一条路径就把这条路径和路径的长度保存下来深度遍历结束后(找到了所有路径)在路径长度数组里面找到最小值再输出相应的路径。