#include<iostream>
#define MAXSIZE 100
#define MAXINT 37267
using namespace std;
typedef struct
{
char vex[MAXSIZE];
int arcs[MAXSIZE][MAXSIZE];
int vexnum,arcnum;
}AMGraph;
int LocateVex(AMGraph G,char v)
{
for(int i=0;i<G.vexnum;i++)
{
if(G.vex[i]==v)
return i;
}
}
void CreatUDN(AMGraph &G)
{
cout<<"输入顶点个数和图的边数:";
cin>>G.vexnum>>G.arcnum;
for(int i=0;i<G.vexnum;i++)
{
cout<<"第"<<i+1<<"个顶点为:";
cin>>G.vex[i];
}
for(int i=0;i<G.vexnum;i++)
for(int j=0;j<G.vexnum;j++)
G.arcs[i][j]=MAXINT;
for(int k=0;k<G.arcnum;k++)
{
char v1,v2;
int w;
cout<<"输入相邻接的两点及两点间的长度:";
cin>>v1>>v2>>w;
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
G.arcs[i][j]=w;
}
return;
}
void ShortestPath_DIJ(AMGraph G,int v)
{
int n=G.vexnum;
bool S[n];
int D[n];
int Path[n];
for(int i=0;i<n;i++)
{
S[i]=false;
D[i]=G.arcs[v][i];
if(D[i]<MAXINT)
Path[i]=v;
else
Path[i]=-1;
}
S[v]=true;
D[v]=0;
for(int j=1;j<n;j++)
{
int min=MAXINT;
int a;
for(int w=0;w<n;w++)
{
if(S[w]==false && D[w]<min)
{
a=w;
min=D[w];
}
}
S[a]=true;
cout<<G.vex[a]<<" ";
for(int w=0;w<n;w++)
{
if(S[w]==false && D[a]+G.arcs[a][w]<D[w])
{
D[w]=D[a]+G.arcs[a][w];
Path[w]=a;
}
}
}
}
int main()
{
AMGraph G;
CreatUDN(G);
int v;
cout<<"开始访问的顶点顺序为:";
cin>>v;
cout<<G.vex[v]<<" ";
ShortestPath_DIJ(G,v);
return 0;
}
本代码采用C++程序语言进行编程,采用迪杰斯特拉算法来实现关键路径的求解,来解决最小路径或者时间问题。