图——图的应用
总目录
![](https://i-blog.csdnimg.cn/blog_migrate/44a0864f02888d9464f80a62c087fd44.png)
代码:
/*
*
* Dijkstra算法
*
*/
void Dijkstra(AMGraph G,int u)
{
for (int i = 0;i<G.vexnum;i++) // 1. 初始化距离数组dist[]、前驱数组p[]
{
dist[i] = G.Edge[u][i];
flag[i] = false;
if (dist[i] == INF) //u、i相邻,p[i] = u ; 不相邻,p[i] = -1
p[i] = -1;
else
p[i] = u;
}
dist[u] = 0;
flag[u] = true; //初始时,集合S中只有一个元素:u
for (int i = 0;i<G.vexnum;i++) // 2. 找源点到每一个顶点的最短路径
{
int temp = INF,t = u;
for (int j = 0;j<G.vexnum;j++) //在集合V-S中寻找距离源点u最近的顶点t
if (!flag[j] && dist[j] < temp)
{
t = j;
temp = dist[j];
}
if (t == u) return; //找不到t,退出循环;否则,将t加入到集合
flag[t] = true;
for (int j = 0;j<G.vexnum;j++) // 3. 更新与t相邻接的顶点到源点u的距离
{
if (!flag[j] && G.Edge[t][j] < INF)
if (dist[j] > (dist[t] + G.Edge[t][j]))
{
dist[j] = dist[t] + G.Edge[t][j];
p[j] = t;
}
}
}
}
//逆向找到该最短路径
void findpath(AMGraph G,Vextype u)
{
int x;
stack<int>S;
cout<<"Source Vex : "<<u<<endl;
for (int