#include"type.h" //Dijkstra算法 void Ppath(MatGrath &G,int path[],int w,int v) //前向递归查找路径上的顶点 { int k; k=path[w]; if (k==v) return; //找到了起点则返回 Ppath(G,path,k,v); //找顶点k的前一个顶点 printf("%s->",G.vexs[k].sight); //输出顶点k } void ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径 { int dist[MAXV],path[MAXV]; int s[MAXV]; int mindis,i,j,u; for (i=0; i",G.vexs[v].sight); //输出路径上的起点 Ppath(G,path,w,v); //输出路径上的中间点 printf("%s\n",G.vexs[w].sight); //输出路径上的终点 } if(s[w]==0) printf("从%d到%d不存在路径\n",v,w); } /*********************** 功能:用floyd算法求给出的两点之间的最好费用 输入:出发地,目的地 输出:地点的最少费用以及路径 ***********************/ //Floyd算法 int Ppath1(MatGrath &G,int path[][MAXV],int v,int w) //前向递归查找路径上的顶点 { int k; k=path[v][w]; if (k==-1) return 0; //找到了起点则返回 Ppath1(G,path,v,k); //找顶点i的前一个顶点k printf("%s->",G.vexs[k].sight); Ppath1(G,path,k,w); //找顶点k的前一个顶点j } void ShortestMoney(MatGrath &G,int v,int w)//求花费最少的路径 { int A[MAXV][MAXV],path[MAXV][MAXV]; int i,j,k; for (i=0; iA[i][k]+A[k][j]) { A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } } if (A[v][w]==INF) { if (v!=w) printf("从%d到%d没有路径\n",v,w); } else { printf(" 从%s到%s路径费用:%d元人民币 路径:",G.vexs[v].sight,G.vexs[w].sight,A[v][w]); printf("%s->",G.vexs[v].sight); //输出路径上的起点 Ppath1(G,path,v,w); //输出路径上的中间点 printf("%s\n",G.vexs[w].sight); //输出路径上的终点 } } /*********************** 功能:用Dijkstra算法求给出的一点到其余个点的最短路径 输入:源点 输出:地点的最短路程以及路径 ***********************/ //Dijkstra算法求单源路径 int Ppath2(MatGrath &G,int path[],int i,int v) //前向递归查找路径上的顶点 { int k; k=path[i]; if (k==v) return k; //找到了起点则返回 Ppath2(G,path,k,v); //找顶点k的前一个顶点 printf("%s->",G.vexs[k].sight);//输出顶点k } void danyuan(MatGrath &G,int v)//求两点之间的最短路径 { int dist[MAXV],path[MAXV]; int s[MAXV]; int mindis,i,j,u; for (i=1; i<=G.vexnum; i++) { dist[i]=G.arc[v][i].length; //距离初始化 s[i]=0; //s[]置空 if (G.arc[v][i].length",G.vexs[v].sight); //输出路径上的起点 Ppath2(G,path,i,v); //输出路径上的中间点 printf("%s\n",G.vexs[i].sight); //输出路径上的终点 } }