关于迪杰斯特拉算法C语言实现,有几句话不理解,求帮助
程序代码:
#define MAX_VERTEX_NUM 11 //最大顶点个数
#define INT_MAX 32767
#define TRUE 1
#define FALSE 0
//p[v][w]为true,代表w是v0到v当前求得最短路径上的顶点
typedef int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//d[v]表示v0到v的距离
typedef int Distance[MAX_VERTEX_NUM];
//final[v]为true当且仅当v属于S,即已经求得从v0到v的最短路径
int final[MAX_VERTEX_NUM];
/*******邻接矩阵*******/
typedef struct Graph
{
int vexs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//带权无向图的权,INT_MAX表示不连通
char vertexType[MAX_VERTEX_NUM][14];//顶点向量,存储名称
int vexnum,arcnum;//图的顶点数和边数
}MGraph;
//Dijkstra算法寻找最短路径
int findShortsetPath( MGraph g,int v0,PathMatrix* P,Distance* D)
{
int v,w,i;
for( v=0;v<g.vexnum;v++ )
{
final[v] = FALSE;
(*D)[v] = g.vexs[v0][v];
for( w=0;w<g.vexnum;w++ )
{
//设空路径
(*P)[v][w] = FALSE;
}
if( (*D)[v]<INT_MAX )
{
(*P)[v0][v] = TRUE;
(*P)[v][v] = TRUE;
}//if
}//for
D[v0] = 0;
//初始化,v0顶点属于集合S
final[v0] = TRUE;
//开始主循环,每次求得v0到某个顶点v的最短路径,并加v到s集合中
//g.vexnum-1 个顶点
for( i=0;i<g.vexnum;i++ )
{
int min = INT_MAX;
//找到距离v0最近的点
for( w=0;w<g.vexnum;w++ )
{
//从v0到w未求得最短路径,执行。对于已经求得的最短路径,
//忽略这些点,即忽略在集合S中的顶点
if( !final[w] )
//如果点v0到w的相比其他点,更近
if( (*D)[w]<min )
{
v = w;
min = (*D)[w];
}//if
}//for
//距离v0最近的点v,加入集合s
final[v] = TRUE;
//更像当前最短路径
for( w=0;w<g.vexnum;w++ )
{
//顶点w不在最短路径集合内,并且v0到v的距离加v到w的距离小于v0到w的距离
//更新D[w]
if( !final[w] && (min+g.vexs[v][w]<(*D)[w]) )
{
(*D)[w] = min+g.vexs[v][w];
(*P)[w] = (*P)[v];//我不理解这句话
(*P)[w][w] = TRUE;
}//if
}//for
}//for
}(*P)[w] = (*P)[v];这句话是吧第v行的地址给了第w行了?那么二维数组p的第w行不是就被覆盖了,第w行不久丢了么?
(*P)[w][w] = TRUE;之后又加这句话,那为什么不写成(*P)[v][w] = TRUE;呢?
一共三个问题,请教大神。









