迪杰斯特拉最短通路算法,算出某图中从某个源点到其余某顶点的最短路径。
用邻接矩阵表示法存储图的结构,若两顶点之前有通路,在矩阵中记A[v0][vi]为两顶点的边上的权值;若没有顶点,则记为32767表示极大值∞。存储好图后就可以调用迪杰斯特拉算法算出最短通路。
#include<iostream>
using namespace std;
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct
{
VerTexType vexs[MVNum];
int arcs[MVNum][MVNum];
int vexnum,arcnum;
}AMGraph;
int LocateVex(AMGraph &G,VerTexType v)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(G.vexs[i]==v)
return i;
}
}
int CreateUDN(AMGraph &G)
{
int i,j;
cout<<"请输入需要构造的图的顶点个数和路径条数:"<<endl;
cout<<"请输入顶点信息和路径信息:"<<endl;
cin>>G.vexnum>>G.arcnum;
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;
}
}
int k,w;
VerTexType v1,v2;
for(k=0;k<G.arcnum;k++)
{
cin>>v1>>v2>>w;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j]=w;
}
return 1;
}
void shortestPath_DIJ(AMGraph &G,char v0,int vi)
{
int S[MVNum],D[MVNum],path[MVNum];
int v;
for(v=0;v<G.vexnum;v++)
{
S[v]=false;
D[v]=G.arcs[v0][v];
if(D[v]<MaxInt)
path[v]=v0;
else
path[v]=-1;
}
S[v0]=true;
D[v0]=0;
int i,w;
for(i=1;i<G.vexnum;i++)
{
int min=MaxInt;
for(w=0;w<G.vexnum;w++)
{
if(!S[w]&&D[w]<min)
{
v=w;
min=D[w];
}
}
S[v]=true;
for(w=0;w<G.vexnum;w++)
{
if(!S[w]&&(D[v]+G.arcs[v][w]<D[w]))
{
D[w]=D[v]+G.arcs[v][w]; path[w]=v;
}
}
if(vi==v)
{
cout<<"最短路径的权值为:";
cout<<D[v]<<endl;
cout<<"最短路径为:";
char j;
cout<<G.vexs[vi]<<"<--";
while(path[v]!=0)
{
j=path[v];
cout<<G.vexs[j]<<"<--";
v=path[v];
}
j=path[v];
cout<<G.vexs[j]<<endl;
}
}
}
void Adjacency_Matrix(AMGraph &G)
{
int i,j;
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
cout<<G.arcs[i][j]<<" ";
}
cout<<endl;
}
}
int main(void)
{
char vi,v0;
int s,n;
AMGraph G;
CreateUDN(G);
cout<<"邻接矩阵为:"<<endl;
Adjacency_Matrix(G);
cout<<"请输入要计算的两个顶点名称:"<<endl;
cin>>v0>>vi;
s=LocateVex(G,v0);
n=LocateVex(G,vi);
shortestPath_DIJ(G,s,n);
}