一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知。给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间的最短路径。
#include<iostream>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MaxInt 32767 //最大值
#define MVNum 100 //最大数量
using namespace std;
int D[MVNum]; //D[i]记录从源到终端的当前最短
int Path[MVNum]; //路径[i]记录是从源到终端上vi的当前最小序列号
typedef struct
{
char vexs[MVNum]; //点列表
int arcs[MVNum][MVNum]; //连接到短端口阵列
int vexnum; //数字总数
int arcnum; //图中GL的总数
} AMGraph;
int LocateVex(AMGraph G,char u)
{//存储在“返回”表中的标签,无论是否返回
int i;
for(i=0;i<G.vexnum;i++)
if(u==G.vexs[i])
return i;
return ERROR;
}
char OrigialVex(AMGraph G,int u)
{//以下文件u的元素作为表存储在返回表中?
return G.vexs[u];
}
int CreateDN(AMGraph &G,int spot,int edge)
{//使用连接LPG阵列的方法创建定向屏蔽
G.vexnum=spot;
G.arcnum=edge;
int i,j,k,w;
char v1,v2;
for(i=0;i<G.vexnum;++i)
cin>>G.vexs[i]; //输入
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
G.arcs[i][j]=MaxInt;
for(k=0;k<G.arcnum;++k)
{
cin>>v1>>v2>>w; ///输入附着到第一个面板的标签
i=LocateVex(G, v1);
j=LocateVex(G, v2); //确定v1和2之间的位置
G.arcs[i][j]=w;
}//for
return OK;
}
void ShortestPath_DIJ(AMGraph G, char V)
{//用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径
/**************begin************/
/**************end************/
}
void Find(AMGraph G,int v)
{//在路径编号组中查找程序编号
if(Path[v]==-1)
return ;
else
{
Find(G,Path[v]);
cout<<OrigialVex(G,Path[v])<<" "; //输出点列表中标记有路径[v]的元素
}
}
int main()
{
char a,b;
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
AMGraph G;
CreateDN(G,n,m); //创建定向屏蔽
cin>>a; //输入
ShortestPath_DIJ(G,a); //如果G的接触点和它的静止点之间有一段短时间
cin>>b; //触点底座b
int v=LocateVex(G,b);//返回地面表中的下一个标记,以验证测量值的数量
cout<<D[v]<<endl; //将它们之间的短距离输出到B
Find(G,v);
cout<<b<<endl;
}
return 0;
}