dijkstra算法

来源:互联网 发布:软件项目设计方案 编辑:程序博客网 时间:2024/06/05 12:43

dijkstra即迪杰斯特拉算法,能够处理无负权值的有向图,无向图中某一点到其他各点最短路的问题。

算法思想步骤如下:

将原点集合V分为两个集合S,U;S表示已确定最短路的点,U表示尚未确定最短路的点。

S={V0},U=V-S;

用数组T存储V0到其他各个点的最短距离。

第一步:第一次将V0添加到S集合中,利用V0与其他点的距离更新数组T:如果V0不能到达,则记为无穷大,V0能到达,则将权重填入数组T

之后则用新加入到S集合中的点来更新数组T。

第二步:找出T中最小的值,即目前距离V0最短的点(U集合中的),并将该点添加到S集合中。由于该图的权值非负,可以得出很明显的结论:该点到V0的距离不能再短了。

重复上述步骤一直到所有的点都添加到S集合中。

迪杰斯特拉算法的原理通过上面的描述也就很清晰了。

自己写了一份很丑的代码,主要体现思想,懒得改了。


代码示例:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define Max 100int graph[Max][Max];    //邻接矩阵int p,q;int rec[Max][2];    //存储最短路径和是否已访问void init(){    scanf("%d%d",&p,&q);    //点数和边数    for(int i=0; i<p; i++)    {        rec[i][0]=99999;        rec[i][1]=1;        for(int j=0; j<p; j++)  //初始化            graph[i][j]=99999;    }}void input(){    int a,b,v;    for(int i=1; i<=q; i++)    {        scanf("%d%d%d",&a,&b,&v);        graph[a][b]=v;        graph[b][a]=v;    }}void dijkstra(){    int com=99999,flag=99999;    int pnt=0,cnt=0;    int i;    rec[pnt][0]=0;    while(cnt<p)    {        cnt++;com=flag=99999;        rec[pnt][1]=0;        i=pnt;        printf("*********%d*********",pnt);        for(int j=0; j<p; j++)        {            if(graph[i][j] == 99999)                continue;            if(rec[j][1]&&graph[i][j]+rec[i][0]<rec[j][0])            {                rec[j][0] = graph[i][j]+rec[i][0];                //if(pnt==6) //printf("////%d////%d\n",j,graph[i][j]);            }        }        for(int j=0; j<p; j++)            if(rec[j][1] && rec[j][0]<flag)        {            flag=rec[j][0];            pnt=j;        }        for(int j=0; j<p; j++)            printf("%d---",rec[j][0]);        printf("\n");    }}int main(){    init();    input();    dijkstra();    for(int i=0; i<p; i++)        printf("%d\n",rec[i][0]);}


原创粉丝点击