图的最短路径问题

  1. 无权图的单源最短路径算法(邻接表存储)

(相似于图的遍历的广度优先算法)

 1 typedef int Vertex;
 2 void UnWeighted(LGraph Graph,Vertex S){
 3     int i;
 4     ListNode W;
 5     int Dist[MaxVertexNumber],Path[MaxVertexNumber];//Dist存储到源点S的最短距离,Path存储到源点S路径
 6     Queue Q;
 7     Q=CreatQueue(Graph->Nn);
 8     for(i=0;i<Graph->Nn;i++){
 9         Dist[i]=Path[i]=-1;   //将Dist和Path初始化为-1
10     }
11     Dist[S]=0;
12     AddQ(Q,S);
13     while(!IsEmpty(Q)){
14         V=DeleteQ(Q);
15         for(W=Graph->G[V].FirstEdge;W;W=W.next){
16             if(Dist[W->AdjV]==-1){
17                 Dist[W->AdjV]=Dist[V]+1;
18                 Path[W->AdjV]=V;
19                 AddQ(Q,W->AdjV);
20             } 
21         }
22     }
23 }

 

 2.有权图的单源最短路径算法(邻接矩阵存储)

 

 1 typedef int Vertex;
 2 #define Infinity 10000;
 3 int Dist[VertexMaxNum],Path[VertexMaxNum];
 4 Vertex FindMinDist(MGraph Graph,int Dist[],int Collected[]){
 5     MinDist=Infinity;
 6     Vertex V,MinV;
 7     for(V=0;V<Graph->Nv;V++){
 8         if(Collected[V]==false && Dist[V]<MinDist){
 9             MinV=V;
10             MinDist=Dist[V];
11         }
12     }
13     if(MinDist<Infinity){
14         return MinV;
15     }
16     else{
17         return ERRORS;
18     }
19 }
20 bool Dijkstra(MGraph Graph,int Dist[],int Path[],Vertex S){
21     bool Collected[VertexMaxNum];
22     Vertex V,W;
23     for(V=0;V<Graph->Nv;V++){
24         Dist[V]=Graph->G[S][V];//默认邻接矩阵中不存在的边用INFINITY表示
25         Path[V]=-1;
26         if(G[S][V]<Infinity){
27             Path[V]=S;
28         }
29         Collected[V]=false;
30     }
31     Dist[S]=0;
32     Collected[S]=true;
33     Collected[V]=true;
34     while(1){
35         V=FindMinDist(Graph,Dist,Collected);
36         Collected[V]=true;
37         if(V==ERRORS){
38             break;
39         }
40         for(W=0;W<Graph->Nv;W++){
41             if(G[V][W]<0) return false;
42             if(Graph->G[V][W]<Infinity && Collected[W]==false){
43                 if(Dist[V]+Graph[V][W]<Dist[W]){
44                    Dist[W]=Dist[V]+Graph[V][W];
45                    Path[W]=V;
46                 }   
47             }
48         }
49     }
50     return true;
51 }

上述单源最短路径算法,findMinDist (),保证了算法的收敛性 

3.有权图多源最短路径算法

1,若有Nv个顶点,将Dijkstra算法调用N遍

2,folyd算法(不能有负值圈)

 1 bool Floyd(MGraph Graph,int Dist[][],Vertex Path[][] ){
 2     Vertex i,j,k;
 3     for(i=0;i<Graph->Nv;i++){
 4         for(j=0;j<Graph->Nv;j++){
 5             Dist[i][j]=Graph->G[i][j];
 6             Path[i][j]=-1;
 7         }
 8     }
 9     for(k=0;k<Graph->Nv;k++){
10         for(i=0;i<Graph->Nv;i++){
11             for(j=0;j<Graph->Nv;j++){
12                 if(Dist[i][k]+Dist[k][j]<Dist[i][j]){
13                     Dist[i][j]=Dist[i][k]+Dist[k][j];
14                     if(i==j && Dist[i][j]<0) return false; //有负值,返回错误
15                     Path[i][j]=k;
16                 }
17             }
18         }
19     }
20     return true;
21 }

 

posted @ 2019-09-05 16:25  ldfm  阅读(978)  评论(0编辑  收藏  举报