• 图的最短路径问题


    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 }
    坚持
  • 相关阅读:
    彻底理解Python中的yield
    python红包随机生成(隔板法)
    闭包的作用
    logging模块
    Python的datetime模块分析
    坑集系列
    Goertzel Algorith(戈策尔算法)用于检出特定输入频率
    Java学习个人笔记(一)配置java环境变量(Feb04,2013 )
    使用Gnu gprof进行Linux平台下的程序分析
    关于微编程(Microprogramming)的简史
  • 原文地址:https://www.cnblogs.com/liudianfengmang/p/11374075.html
Copyright © 2020-2023  润新知