图论最短路径 Dijkstra算法和模板

来源:互联网 发布:实况足球手柄按键mac 编辑:程序博客网 时间:2024/05/19 12:40

From:http://blog.sina.com.cn/s/blog_61533c9b0100iaj4.html


Dijkstra算法是用来求单源最短路径的算法。时间复杂度O(N^2);
注意:1,不能求含有负权的图,含有负权可以采用Bellman-ford和SPFA算法
      2.不能直接求单源最长路径

算法思想:把所有的边分成两个集合A,B。集合A表示已经求出最短路径的点,不断扩展集合A,减少集合B。每一扩展就从结合B中找出到源点距离最短的点,加入到A。

算法模板:
矩阵存储:
void Dijkstra(int M,int Source) //Source is the source,M is the number of point; {        int dis[100]; //The distance to the source        int map[100][100];  //The distance of each two distance        bool visit[100];   //If the point has been visited;        memset(dis,0,sizeof(dis));        memset(visit,false,sizeof(visit));        int sta=Source;  visit[sta]=true;  //sta  is source        for(i=0;i<=M;i++)        {           int m=INT_MAX; int mark=sta;           for(j=0;j<=M;j++)           if(  visit[j]==false && sta!=j)//算法核心代码          {               if( map[sta][j]!=0 && dis[j]>dis[sta]+map[sta][j])                     dis[j]=dis[sta]+map[sta][j];               else if( map[sta][j]!=0 && dis[j]==0)                     dis[j]=dis[sta]+map[sta][j];                                              //关键地方               if(dis[j]<m &&dis[j]!=0)              {                      m=dis[j];                      mark=j;               }           }              if(m==0||m==INT_MAX) break;                  visit[mark]=true; sta=mark;            }       }



原创粉丝点击