void Dispath(MatGraph g, int dist[], int path[], int S[], int v)
{
int i, j, k;
int apath[MAXV], d; //最短路径(逆向) && 顶点个数
for (i = 0; i < g.n; i++)
if (S[j] == 1 && i != v)
{
cout << "从顶点" << v << "到顶点" << i << "的路径长度为" << dist[i] << "\t路径为:";
d = 0; //顶点数置0
apath[d] = i; //添加路径上的结点
k = path[i];
if (k == -1)
cout << "无路径" << endl;
else
{
while (k != v)
{
d++;
apath[d] = k;
k = path[k];
}
d++; //添加路径上的结点
apath[d] = v;
cout << apath[d]; //起点
for (j = d - 1; j >= 0; j--) //逆向 输出其他顶点
cout << apath[j];
cout << endl;
}
}
}
void Dijkstra(MatGraph g, int v)
{
int dist[MAXV], path[MAXV];
int S[MAXV]; //1表示在S中,0表示在U中
int MINdis;
int i, j, u;
for (i = 0; i < g.n; i++)
{
dist[i] = g.edges[v][i]; //距离初始化
S[i] = 0; //在U中
if (g.edges[v][i] < INF)
path[i] = v; //能到达的(有边相连的) 置为邻接点下标
else
path[i] = -1; //无边相连,置为-1
}
S[v] = 1; //源点置S中
path[v] = 0; //本身置0
for (i = 0; i < g.n - 1; i++)
{
MINdis = INF;
for (j = 0; j < g.n; j++) //找最小
if (S[j] == 0 && dist[j] < MINdis)
{
u = j;
MINdis = dist[j]; //MINdis记录最短的
}
S[u] = 1; //放S中
for (j = 0; j < g.n; j++) //修改U中最短路径 把该列小的更新掉dist
if (S[j] == 0)
if (g.edges[u][j] < INF && dist[u] + g.edges[u][j] < dist[j])
{
dist[j] = dist[u] + g.edges[u][j]; //前路径加现路径
path[j] = u;
}
}
Dispath(g, dist, path, S, v);
}
最短路径代码 -- Dijkstra
最新推荐文章于 2024-05-23 11:51:48 发布