关于迪杰斯特拉算法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;呢?
一共三个问题,请教大神。