源码
typedef struct VertexType
{
int index;
string name;
};
typedef int VRType;
typedef struct ArcCell
{
VRType adj =0 ;
}AdjMatrix[MAX_NUM][MAX_NUM];
typedef struct MGraph
{
VertexType vexs[MAX_NUM];
AdjMatrix arxs;
int vexnum, arcnum;
};
void FindSPath(MGraph G, VertexType start, VertexType end)
{
int previous[MAX_NUM];
int d[MAX_NUM];
for (int i = 0; i < G.vexnum; i++)
{
d[i] = INT_MAX;
previous[i] = -1;
}
d[start.index] = 0;
vector<VertexType> S;
vector<VertexType> Q;
for (int i = 0; i < G.vexnum; i++)
Q.push_back(G.vexs[i]);
while (!Q.empty())
{
VertexType u;
u = Extract_Min(Q,d);
S.push_back(u);
vector<VertexType> W;
int line = u.index;
for (int i = 0; i < MAX_NUM; i++)
{
if (G.arxs[line][i].adj != 0)
{
W.push_back(G.vexs[i]);
}
}
for (int i = 0; i < W.size(); i++)
{
int v = W[i].index;
if (d[v] > d[line] + G.arxs[line][v].adj)
{
d[v] = d[line] + G.arxs[line][v].adj;
previous[v] = line;
}
}
}
string path = start.name;
int sindex = start.index;
for (int i = 0; i < MAX_NUM; i++)
{
if (previous[i] == sindex)
{
path += "->" + G.vexs[i].name;
sindex = i;
continue;
}
}
cout << "\n路径:" << path <<endl;
cout << "\n路径长度:" << d[end.index] << endl;
}