论文部分内容阅读
摘 要:数据结构是计算机学科的核心课程,有向图是图结构的重要内容之一。在计算机中如果用图的邻接矩阵存储带权有向图,用权值表示各有向边的长度,那么利用有向图的最短路径理论就可以解决交通网络中的路线问题,如某个源点到其余各顶点的最短路径以及所有顶点之间的最短路径等等,从而达到资源最省的目的。
关键词:源点;顶点;终点;有向图;最短路径
中图分类号:TP391.41
1 求从某个源点到其余各顶点的最短路径
针对上述邻接矩阵,为了便于分析和计算机存储,引进一个辅助向量disc,它的每个分量disc[i]表示当前所找到的从源点V0出发到达终点Vi的最短路径,初态为:若从源点V0到顶点Vi没有边,则disc[i]为∞,用计算机中可表示的最大正数MAXNUM表示,若从源点V0到顶点Vi有边,则disc[i]为该边上的权值。设第一条最短路径为,其中k满足:
disc[k]=min{disc[i]|Vi∈V-V0},v是G的顶点的集合。
下面求下一条最短路径。
假设下一次要到达的终点是Vj,那么最短路径有两种可能,一种是,另一种是,与之相对应,其长度可能是从V0到Vj的有向边上的权值,也可能是disc[k]与从Vk到Vj的有向边上的权值之和。如果S是已求得的最短路径的终点的集合,那么下一条最短路径必然是从源点V0出发,中间只经过S中的顶点就可到达的那些顶点VZ(VZ∈V-S)的路径中的一条。
所以通常情况下,下一条长度次短的最短路径的长度必然是:
disc[k]=min{disc[i]|Vi∈V-S}
在每一次求得一条最短路径之后,将终点Vk加入集合S,对所有的Vi∈V-S修改其disc[i]:
disc[i]=min{disc[i],disc[k]+Edge[k][i]}
其中,Edge[k][i]是边上的权值。
综上所述,用程序设计语言实现该算法如下:
const int Numvers=100;//常量定义,图中最大顶点个数
class Graph{ //图的类定义
private:
int Edge[Numvers] [Numvers];//存放图的邻接矩阵
int disc[Numvers]; //存放从顶点V0到其它各顶点的最短路径长度
int path[Numvers]; //存放在最短路径上该顶点的前一顶点号
int S[Numvers]; //已求得的在最短路径上的顶点号
public:
void ShortestPath(int,int);
};
void Graph::ShortestPath(int n, int v){ //G是一个具有n个顶点的带权有向图
for(int i=0;i disc[i]=Edge[v][i];
S[i]=0; //已求出最短路径的顶点集合初始化
if(i!=v && disc[i] else path[i]=-1; //路径存放数组初始化
}
S[v]=1; disc[v]=0; //顶点V加入顶点集合
for(i=0;i int min=MAXNUM;int u=v;
for(int j=0;j if(!S[j] && disc[j] S[u]=1; //将顶点u加入集合S,表示它已在最短路径上
for(int w=0;w if(!S[w] && Edge[u][w] disc[w]=disc[u]+Edge[u][w]; path[w]=u;
}
}
}
引用上述算法,在图1中,从顶点V0出发到其它各顶点的最短路径的逐步求解过程如下:源点 终点
2 所有顶点之间的最短路径
要求交通网络中每一对顶点之间的最短路径,可轮流以每一个顶点为源点,其余顶点为终点多次调用上述算法来完成。但还可以用依次加入中间顶点,取得最短路径的方法:
(1)使用图的邻接矩阵存储带权有向图;
(2)取任意两个顶点Vi和Vj,其边上的权值作为路径长度;
(3)增加中间顶点,在增加中间顶点的过程中,总是以路径长度较短者作为新路径代替原路径;
(4)修改邻接矩阵的元素,用新取得的较短路径长度代入。
算法如下:
定义一个n阶方阵序列:Z(0),Z(1),…,Z(k),…,Z(n),
当k=0时,Z(k)[i][j]=Edge[i][j];
当1≤k≤n时
Z(k)[i][j]=min{Z(k-1)[i][j],Z(k-1)[i][k]+ Z(k-1)[k][j]}。
下面用程序设计语言实现该算法:
void Graph::AllLengths(int n) { //Edge[n][n]是一个具有n个顶点的图的邻接矩阵。
//z[i][j]是顶点i和j之间的最短路径长度。
//path[i][j]是相应路径上顶点j的前一顶点的顶点号,在求最短路径时图的类定义中//要修改path为path[Numvers][Numvers]。
for(int i=0;i for(int j=0;j z[i][j]=Edge[i][j];
if(i< >j && z[i][j] else path[i][j]=0; //i到j无路径
}
for(int k=0;k for(i=0;i for(j=0;j if(z[i][k]+z[k][j] z[i][j]=z[i][k]+z[k][j];path[i][j]=path[k][j]; //縮短路径长度,绕过k到j
}
}
参考文献:
[1]许卓群.数据结构[M].北京:中央广播电视大学出版社,2003:226-254.
[2]左春荣.数据结构[M].北京:中国物质出版社,2008:99-118.
[3]殷人昆.数据结构[M].北京:清华大学出版社,2010:283-286.
作者单位:营口职业技术学院,辽宁营口 115000
关键词:源点;顶点;终点;有向图;最短路径
中图分类号:TP391.41
1 求从某个源点到其余各顶点的最短路径
针对上述邻接矩阵,为了便于分析和计算机存储,引进一个辅助向量disc,它的每个分量disc[i]表示当前所找到的从源点V0出发到达终点Vi的最短路径,初态为:若从源点V0到顶点Vi没有边,则disc[i]为∞,用计算机中可表示的最大正数MAXNUM表示,若从源点V0到顶点Vi有边,则disc[i]为该边上的权值。设第一条最短路径为
disc[k]=min{disc[i]|Vi∈V-V0},v是G的顶点的集合。
下面求下一条最短路径。
假设下一次要到达的终点是Vj,那么最短路径有两种可能,一种是
所以通常情况下,下一条长度次短的最短路径的长度必然是:
disc[k]=min{disc[i]|Vi∈V-S}
在每一次求得一条最短路径之后,将终点Vk加入集合S,对所有的Vi∈V-S修改其disc[i]:
disc[i]=min{disc[i],disc[k]+Edge[k][i]}
其中,Edge[k][i]是边
综上所述,用程序设计语言实现该算法如下:
const int Numvers=100;//常量定义,图中最大顶点个数
class Graph{ //图的类定义
private:
int Edge[Numvers] [Numvers];//存放图的邻接矩阵
int disc[Numvers]; //存放从顶点V0到其它各顶点的最短路径长度
int path[Numvers]; //存放在最短路径上该顶点的前一顶点号
int S[Numvers]; //已求得的在最短路径上的顶点号
public:
void ShortestPath(int,int);
};
void Graph::ShortestPath(int n, int v){ //G是一个具有n个顶点的带权有向图
for(int i=0;i
S[i]=0; //已求出最短路径的顶点集合初始化
if(i!=v && disc[i]
}
S[v]=1; disc[v]=0; //顶点V加入顶点集合
for(i=0;i
for(int j=0;j
for(int w=0;w
}
}
}
引用上述算法,在图1中,从顶点V0出发到其它各顶点的最短路径的逐步求解过程如下:源点 终点
2 所有顶点之间的最短路径
要求交通网络中每一对顶点之间的最短路径,可轮流以每一个顶点为源点,其余顶点为终点多次调用上述算法来完成。但还可以用依次加入中间顶点,取得最短路径的方法:
(1)使用图的邻接矩阵存储带权有向图;
(2)取任意两个顶点Vi和Vj,其边上的权值作为路径长度;
(3)增加中间顶点,在增加中间顶点的过程中,总是以路径长度较短者作为新路径代替原路径;
(4)修改邻接矩阵的元素,用新取得的较短路径长度代入。
算法如下:
定义一个n阶方阵序列:Z(0),Z(1),…,Z(k),…,Z(n),
当k=0时,Z(k)[i][j]=Edge[i][j];
当1≤k≤n时
Z(k)[i][j]=min{Z(k-1)[i][j],Z(k-1)[i][k]+ Z(k-1)[k][j]}。
下面用程序设计语言实现该算法:
void Graph::AllLengths(int n) { //Edge[n][n]是一个具有n个顶点的图的邻接矩阵。
//z[i][j]是顶点i和j之间的最短路径长度。
//path[i][j]是相应路径上顶点j的前一顶点的顶点号,在求最短路径时图的类定义中//要修改path为path[Numvers][Numvers]。
for(int i=0;i
if(i< >j && z[i][j]
}
for(int k=0;k
}
}
参考文献:
[1]许卓群.数据结构[M].北京:中央广播电视大学出版社,2003:226-254.
[2]左春荣.数据结构[M].北京:中国物质出版社,2008:99-118.
[3]殷人昆.数据结构[M].北京:清华大学出版社,2010:283-286.
作者单位:营口职业技术学院,辽宁营口 115000