在计算最短源路径中,涉及到了两个比较重要的算法,即Bellman-Ford算法和Dijkstra算法。Bellman-Ford算法是判断一个有向图里面是否存在负权回路,此算法是运用松弛技术,对每个顶点v,逐步减小从源s到v的最短路径的权的估计值d[v]直至达到实际最短路径的权为止。算法返回TRUE,当且仅当图中不包含从源点可达的负权回路。
源代码如下:
Dijkstra算法是用来计算从源点s出发,到其它顶点的最终最短路径的权值。
算法反复的选择具有最短路径估计的顶点,并将其加入到已经选择了的顶点
的集合中,直到所有的顶点都选择完为止。
代码如下:
数组D[]中,最终就存储了从顶点出发,到其它n-1个顶点的最小的权值。
源代码如下:
- bool fellman(int n)
- {
- memset(D,0,sizeof(D));
- Node *link;
- for(int i=0;i<n-1;++i)
- {
- bool f = false;
- for(int j=0;j<n;++j)
- {
- link = Edg[j];
- while(link)
- {
- if(D[link->to]>D[j]+link->value)
- {
- D[link->to] = D[j] + link->value;
- f = true;
- }
- link = link->next;
- }
- }
- if(f == false) return true;
- }
- for(int i=0;i<n;++i)
- {
- link = Edg[i];
- while(link)
- {
- if(D[link->to] > D[i] + link->value) return false;
- link = link->next;
- }
- }
- return true;
- }
算法反复的选择具有最短路径估计的顶点,并将其加入到已经选择了的顶点
的集合中,直到所有的顶点都选择完为止。
代码如下:
- void Dijkstra(int n)
- {
- D[1] = 0;
- int r=0;
- memset(visit,false,sizeof(visit));
- for(int k=1;k<=n;++k)
- {
- double min = 0xfffffff;
- for(int i=1;i<=n;++i)
- {
- if(!visit[i] && min>D[i])
- {
- min = D[i];
- r = i;
- }
- }
- Node *link = Edg[r];
- visit[r] = true;
- while(link)
- {
- if(!visit[link->to] && D[link->to]>link->value)
- D[link->to] = link->value;
- link = link->next;
- }
- }
- }