最短路径算法源程序代码文档格式.docx
- 文档编号:20578343
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:14
- 大小:18.18KB
最短路径算法源程序代码文档格式.docx
《最短路径算法源程序代码文档格式.docx》由会员分享,可在线阅读,更多相关《最短路径算法源程序代码文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
/*输出数据:
指从该函数中带回到调用函数的数据,包括:
/*jiedian[][]--节点名称*/
/*NodeNum--节点名的个数*/
/*返回值:
数据读入是否成功的标志*/
/*0--失败1--成功*/
intInputJiedianNode(charjiedian[][NameLenght],int*NodeNum)
{inti,n;
FILE*fp;
if(!
(fp=fopen(JiedianNameFile,"
r"
)))
{printf("
节点数据文件不存在\n"
);
getch();
return(0);
}
fscanf(fp,"
%d"
&
n);
n)
文件中无节点数据!
\n"
for(i=0;
i<
n;
i++)fscanf(fp,"
%s"
jiedian[i]);
fclose(fp);
*NodeNum=n;
return
(1);
/*从文件中读入最短路径数据*/
/*intdist[][]:
节点间最短路径的值*/
/*intPath[][]:
节点间最短路径结点数据*/
指针变量,表示读入数据的多少*/
数据文件:
MinPathDataFile*/
二进制数据,数据存放顺序:
节点个数n>
<
n*n个最短路径值>
n*n个结点值>
/*jiedian[][]*/
/*Path[][]*/
/*NodeNum*/
数据读入是否成功的标志*/
intInputMinPath(intdist[][JiedianNum],intPath[][JiedianNum],int*NodeNum)
{intn;
(fp=fopen(MinPathDataFile,"
rb"
最小路径数据文件不存在!
fread(&
n,sizeof(int),1,fp);
fread(dist,sizeof(int),n*n,fp);
fread(Path,sizeof(int),n*n,fp);
/*查找节点名*/
/*charstr[][]:
/*intn:
str中数据的行数,即节点名的个数*/
/*char*p:
指针变量,表示需要查找的节点名*/
全部函数参数均为输入数据*/
返回值作为函数的输出数据*/
/*查找成功:
被查找的节点名在数组str中的序号*/
/*查找失败:
-1,表示被查找的节点名未出现在数组中*/
intsearch(charstr[][NameLenght],intn,char*p)
{inti=0;
while(i<
{if(!
strcmp(str[i],p))return(i);
i++;
return(-1);
/*计算节点间最短路径*/
无>
/*文本数据文件:
JiedianPathFile*/
边数>
结点名>
边值>
结点个数n>
/*说明:
文本数据文件中数据间用空格或换行符格开*/
voidshorttestpath()
{
inti,j,k,NodeNum,EgeNum,val;
intarc[JiedianNum][JiedianNum];
//权值矩阵
charjiedian[JiedianNum][NameLenght];
//结点
intdist[JiedianNum][JiedianNum];
//最短路径长度矩阵
intPath[JiedianNum][JiedianNum];
//最短路径矩阵
charjiedian1[NameLenght],jiedian2[NameLenght];
/*----------------------------------------------------*/
/*算法步骤:
*/
/*1、读入结点数据*/
/*2、邻接矩阵初始化:
所有元素赋Infinity,*/
/*对角线元素赋0*/
/*3、读入结点间边的数据,转换为邻接矩阵的数据*/
/*4、路径矩阵初始化,若arc[i][j]<
Infinity,*/
/*则:
at[i][j]=i否则:
Path[i][j]=-1*/
/*5、计算最短路径*/
/*6、保存最小路径数据*/
/*----------------------------------------------------*/
//--------初始化邻接矩阵------------
InputJiedianNode(jiedian,&
NodeNum))return;
else
{
NodeNum;
i++)
for(j=0;
j<
j++)
if(i==j)arc[i][j]=0;
elsearc[i][j]=Infinity;
printf("
%s\n"
//-----读入结点间边的数据-------
(fp=fopen(JiedianPathFile,"
结点间边的数据文件不存在!
!
return;
EgeNum);
EgeNum)
文件中无结点间边的数据!
for(k=0;
k<
EgeNum;
k++)
jiedian1);
jiedian2);
val);
i=search(jiedian,NodeNum,jiedian1);
j=search(jiedian,NodeNum,jiedian2);
arc[i][j]=arc[j][i]=val;
//---------路径矩阵初始化-------------
if((arc[i][j]<
Infinity)&
&
(i!
=j))
Path[i][j]=i;
elsePath[i][j]=-1;
//初始化最短路径长度矩阵dist[][]
dist[i][j]=arc[i][j];
//弗罗伊德算法
if(dist[i][k]+dist[k][j]<
dist[i][j])
dist[i][j]=dist[i][k]+dist[k][j];
Path[i][j]=Path[k][j];
//---------保存城市间最短路径的信息-----------------
wb"
打不开文件%s!
MinPathDataFile);
fwrite(&
NodeNum,sizeof(int),1,fp);
fwrite(dist,sizeof(int),NodeNum*NodeNum,fp);
fwrite(Path,sizeof(int),NodeNum*NodeNum,fp);
}
/*求一个节点到其它节点的最短路径*/
/*数据文件:
/*指定节点名,从键盘输入*/
/*指定节点到其它所有节点的最短路径值和路径*/
/*(屏幕显式)*/
voidOne_To_Other_Path()
{inti,j,k,NodeNum,StartNode;
inttop,PathStack[JiedianNum];
charjiedian1[NameLenght];
/*-----------------------------------------------------*/
/*1、输入结点数据*/
/*2、输入最小路径数据*/
/*3、输入起点节点名称,并确定其正确性*/
/*方法:
调用查找函数,若返回值>
=0则正确*/
/*4、依次求起点节点到其它节点的最短路径*/
根据两节点的序号i,j在dist数组中获得*/
/*最短路径值。
根据Path数组中结点间路径*/
/*数据的关系求的其结点序列并放入栈中,*/
/*然后依次输出栈数据。
//从文件中读入结点数据
NodeNum))
读取节点文件失败%s!
JiedianNameFile);
//从文件中读入最小路径数据
InputMinPath(dist,Path,&
读取最短路径文件失败%s!
//输入起点节点名
请输入节点名称:
"
scanf("
jiedian1);
k=search(jiedian,NodeNum,jiedian1);
if(k<
0)
错误的节点名称%s!
//获得路径结点关系,并依次入栈
j=i;
top=StartNode=0;
if(i==k)continue;
起始节点和终止节点:
%s==>
jiedian[k],jiedian[i]);
最短路径:
%dkm\n"
dist[k][i]);
PathStack[top++]=j;
while(Path[k][j]!
=k)
PathStack[top++]=Path[k][j];
j=Path[k][j];
//依次输出最小路径上的结点
最短路经:
\n%s"
jiedian[k]);
while(top)
==>
jiedian[PathStack[--top]]);
\n\n"
/*求一个节点到另一个节点的最短路径*/
/*起点节点名,终点节点名,从键盘输入*/
/*起点节点到终点节点的最短路径值和路径*/
voidOne_To_One_Path()
{inti,j,k,NodeNum,StartNode,EndNode;
/*1、输入结点数据*/
/*3、输入起点节点和终点节点名称,并确定其正确性*/
/*4、求起点节点到终点节点的最短路径*/
读取最短路径文件失败%s!
//用户输入起点节点和终点节点
请输入起始节点名称:
请输入终止节点名称:
//调用查找函数,
StartNode=search(jiedian,NodeNum,jiedian1);
EndNode=search(jiedian,NodeNum,jiedian2);
if(StartNode<
0||EndNode<
0)//检测节点名正确性
错误的节点名称!
//获得结点关系,并依次进栈,输出之
距离为%s==>
%s:
jiedian1,jiedian2,dist[StartNode][EndNode]);
i=StartNode;
j=EndNode;
top=0;
//终点节点入栈
while(Path[i][j]!
=i)
PathStack[top++]=Path[i][j];
//最短路径上其它结点入栈
j=Path[i][j];
intnemu()
intnum;
\n*************最短路径路由程序******************\n"
*%15c1---全部节点%22c\n"
'
'
'
*'
*%15c2---从一个节点到其他所有节点%6c\n"
*%15c3---从一个节点到另一个节点%8c\n"
*%15c4---退出%26c\n"
**************************************************\n"
%15c请选择1,2,3,4:
do{
num);
}while(num<
1||num>
4);
return(num);
voidmain()
while
(1)
switch(nemu())
case1:
shorttestpath();
break;
case2:
One_To_Other_Path();
case3:
One_To_One_Path();
case4:
return;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 路径 算法 源程序 代码