从一顶点到其余各顶点的最短路径:
/*从一顶点到其余各顶点的最短路径*/
#ifndef DJKSTRA
void PATH(adjlist path, int m, int j) //m = 1,j = 2/3
{
edgenode *p,*q,*s;
//把顶点j的当前最短路径清除掉
p = path[j];
while (p != NULL)
{
path[j] = p->next;
delete p;
p = path[j];
}
//把到顶点m的最短路径拷贝过来到顶点j的最短路径上
p = path[m];
while (p != NULL)
{
q = new edgenode;
q->adjvex = p->adjvex;
if(path[j] == NULL)
path[j] = q;
else
s->next= q;
s = q;
p = p->next;
}
//把顶点j加人到path[j]单链表的最后,形成新的目前最短路径
q = new edgenode;
q->adjvex = j;
q->next = NULL;
s->next = q;
}
void Dijkstra(adjmatrix GA,int dist[],adjlist path, int i, int n)
//利用狄克斯特拉算法求图GA中从顶点i到其余每个顶点间的
//最短距离和最短路径,它们分别被存于数组dist和path数组中
{
int w,m;
//定义作为集合使用的动态数组S
int *s = new int[n];
//分别给s,dist和path数组赋初值
for (int j = 0; j < n; j++)
{
if(j == i)
s[j] = 1;
else
s[j] = 0;
dist[j] = GA[i][j];
if (dist[j] < MaxValue && j != i)
{
edgenode *p1 = new edgenode;
edgenode *p2 = new edgenode;
p1->adjvex = i;
p2->adjvex = j;
p2->next = NULL;
p1->next = p2;
path[j] = p1;
}
else
path[j] = NULL;
}
//共进行n-2次循环,每次求出从源点i到终点m的最短路径及长度
for (int k = 1; k <= n-2; k++)
{
//求出第k个终点m
w = MaxValue;
m = i;
for (int j = 0; j < n; j++)
{
if (s[j] == 0 && dist[j] < w)
{
w = dist[j];
m = j;
}
}
//若条件成立,则把顶点m并入集合S中,否则退出循环,
//因为剩余的顶点,其最短路径长度均为MaxValue,无需再计算下去
if(m != i)
s[m] = 1;
else
break;
//对s元素为0的对应dist和path中的元素做必要修改
for (int j = 0; j < n; j++)
{
if (s[j] == 0 && dist[m] + GA[m][j] < dist[j])
{
dist[j] = dist[m] + GA[m][j];
PATH(path,m,j); //调用此函数,由到顶点m的最短路径和顶点j,构成到顶点j的目前最短路径
}
}
}
for (int j = 0; j < n; j++)
{
cout<<dist[j]<<" ";
}
}
#endif
每对顶点之间的最短距离,不记录最短路径:
#ifndef FLOYED
void Floyed(adjmatrix GA, adjmatrix A,int n)
//利用弗洛伊德算法求GA表示的图中每对顶点之间的最短长度,对应保存于二维数组A中
{
//给二维数组A赋初值,它等于图的邻接矩阵GA
for (int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
A[i][j] = GA[i][j];
//依次以每个顶点作为中间点,逐步优化数组A
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(i == k || j == k || i == j)
continue;
if(A[i][k] + A[k][j] < A[i][j])
A[i][j] = A[i][k] + A[k][j];
}
}
}
}
#endif