标签:dist int Graph 路径 浙大 Dijkstra 收录 数据结构
普通的Dijkstra只能更新一个前驱节点和得到单源最短路径的距离。
那么如果有多条最短路径的话,那么就需要增加一些判断。主要是在dist[V]+<V,W><?dist[W]这个判断失效后,增加一个if(dist[V]+<V,W>==dist[W])的判断即可;这个判断面向所有的V的邻接节点,不管是否已经被收入到最短路径的集合中。因为如果W是从V发展得到的,那么此时已经在W点了,这个时候判断就会是dist[W]+<V,W>==dist[V],但是由于最短路径是递增的,因此如果W是由V发展的,那么dist[w]本身就比dist[v]大了,更何况加上了<V,W>,因此不会影响到从V发展过来的情况。
还有一种情况就是收入了V后,邻接点W也已经被收录了,那么容易知道,W因为已经被收录了,因此可以确定是最短路径;但是还有一个问题是可能由其他的最短路径,因此对W进行更新也是合理的(即使W被收录了)
bool Dijkstra( MGraph Graph, int dist[], int path[], Vertex S )
{
int collected[MaxVertexNum];
Vertex V, W;
/* 初始化:此处默认邻接矩阵中不存在的边用INFINITY表示 */
for ( V=0; V<Graph->Nv; V++ ) {
dist[V] = Graph->G[S][V];
if ( dist[V]<INFINITY )
path[V] = S;
else
path[V] = -1;
collected[V] = false;
}
/* 先将起点收入集合 */
dist[S] = 0;
collected[S] = true;
while (1) {
/* V = 未被收录顶点中dist最小者 */
V = FindMinDist( Graph, dist, collected );
if ( V==ERROR ) /* 若这样的V不存在 */
break; /* 算法结束 */
collected[V] = true; /* 收录V */
for( W=0; W<Graph->Nv; W++ ) /* 对图中的每个顶点W */
/* 若W是V的邻接点并且未被收录 */
if ( collected[W]==false && Graph->G[V][W]<INFINITY ) {
if ( Graph->G[V][W]<0 ) /* 若有负边 */
return false; /* 不能正确解决,返回错误标记 */
/* 若收录V使得dist[W]变小 */
if ( dist[V]+Graph->G[V][W] < dist[W] ) {
dist[W] = dist[V]+Graph->G[V][W]; /* 更新dist[W] */
path[W] = V; /* 更新S到W的路径 */
}
}
/*--------------------增加的代码判断部分------------------------------*/
else if(dist[V]+Graph->G[V][W]==dist[W]){//其他的情况不论是否已经收录,相等的话就增加
multishortest[W]=multishorest[W]+multishortest[V];
}
} /* while结束*/
return true; /* 算法执行完毕,返回正确标记 */
}
标签:dist,int,Graph,路径,浙大,Dijkstra,收录,数据结构 来源: https://blog.csdn.net/qq_35299223/article/details/100361988
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。