Dijkstra算法

求最短路径,这个算法没有什么特别的,对于算法入门,这个算法要熟练的写出来。

刚刚写了一遍,现在再写一遍,把思路一遍写出。c语言形式。

首先是图的数据结构,处理这个算法的时候用的是图的邻接矩阵。

考虑一下定义,有图中顶点,构成的邻接矩阵,顶点数与边数。

typedef struct MGraph

{

char vexs[MAXVEX];

int arc[MAXVEX][MAXVEX];

int numVertexes,numEdges;

}MGraph;

我们先申明两个函数,一个创建图,一个计算最短距离。

void createMGraph(MGraph *g);
void shortPathDijkstra(MGraph g,int v0,int p[],int s[]);

创建图这个不多说。

void createMGraph(MGraph *g)
{
    int i,j;
    g->numEdges=16;
    g->numVertexes=9;

    for(i=0;i<MAXVEX;i++)
    {
        g->vexs[i]=i;
    }

    for(i=0;i<g->numVertexes;i++)
    {
        for(j=0;j<g->numVertexes;j++)
        {
            if(i==j)
            {
                g->arc[i][j]=0;
            }
            else
            {
                g->arc[i][j]=g->arc[j][i]=INFINITY;
            }
        }
    }

    g->arc[0][1]=1;
    g->arc[0][2]=5;
    g->arc[1][2]=3;
    g->arc[1][3]=7;
    g->arc[1][4]=5;
    g->arc[2][4]=1;
    g->arc[2][5]=7;
    g->arc[3][4]=2;
    g->arc[3][6]=3;
    g->arc[4][5]=3;
    g->arc[4][6]=6;
    g->arc[4][7]=9;
    g->arc[5][7]=5;
    g->arc[6][7]=2;
    g->arc[6][8]=7;
    g->arc[7][8]=4;

    for(i=0;i<g->numVertexes;i++)
    {
        for(j=i;j<g->numVertexes;j++)
        {
            g->arc[j][i] =g->arc[i][j];
        }
    }

}

好,求最短距离,从代码中看思路。先看整个代码

void shortPathDijkstra(MGraph g,int v0,int p[],int s[])
{
    int v,w,k,min;
    int final[MAXVEX];
    for(v=0;v<g.numVertexes;v++)
    {
        final[v]=0;
        s[v]=g.arc[v0][v];
        p[v]=0;
    }
    s[v0]=0;
    final[v0]=1;

    for(v=1;v<g.numVertexes;v++)
    {
        min = INFINITY;
        for(w=0;w<g.numVertexes;w++)
        {
            if(!final[w]&&s[w]<min)
            {
                k=w;
                min=s[w];
            }
        }
        final[k]=1;
        for(w=0;w<g.numVertexes;w++)
        {
            if(!final[w]&&(min+g.arc[k][w]<s[w]))
            {
                s[w] = min+g.arc[k][w];
                p[w] = k;
            }
        }
    }
}

第一块数据处理化,这个不用多说。下面就开始计算v0到每个点的最短距离,给出for循环计算每个点,从v1开始。

for(v=1;v<g.numVertexes;v++)

我们对最短距离进行依次更改,在一开始初始化的时候,我们对v0直接连接的点的距离加入到待确定最短距离当中。

之后我们对点v1进行处理时,将v1连接的点距离加上最短距离跟待确定最短距离进行比较,如果小于待确定最短距离,则更改该距离,待循环到该点之后变为确定最短距离。

依次循环。

最后给出完整代码:

#include <stdio.h>

#define MAXVEX 9
#define INFINITY 65535

//定义一个图结构
typedef struct MGraph
{
    char vexs[MAXVEX];
    int arc[MAXVEX][MAXVEX];
    int numVertexes,numEdges;
}MGraph;
void createMGraph(MGraph *g);
void shortPathDijkstra(MGraph g,int v0,int p[],int s[]);

void createMGraph(MGraph *g)
{
    int i,j;
    g->numEdges=16;
    g->numVertexes=9;

    for(i=0;i<MAXVEX;i++)
    {
        g->vexs[i]=i;
    }

    for(i=0;i<g->numVertexes;i++)
    {
        for(j=0;j<g->numVertexes;j++)
        {
            if(i==j)
            {
                g->arc[i][j]=0;
            }
            else
            {
                g->arc[i][j]=g->arc[j][i]=INFINITY;
            }
        }
    }

    g->arc[0][1]=1;
    g->arc[0][2]=5;
    g->arc[1][2]=3;
    g->arc[1][3]=7;
    g->arc[1][4]=5;
    g->arc[2][4]=1;
    g->arc[2][5]=7;
    g->arc[3][4]=2;
    g->arc[3][6]=3;
    g->arc[4][5]=3;
    g->arc[4][6]=6;
    g->arc[4][7]=9;
    g->arc[5][7]=5;
    g->arc[6][7]=2;
    g->arc[6][8]=7;
    g->arc[7][8]=4;

    for(i=0;i<g->numVertexes;i++)
    {
        for(j=i;j<g->numVertexes;j++)
        {
            g->arc[j][i] =g->arc[i][j];
        }
    }

}


void shortPathDijkstra(MGraph g,int v0,int p[],int s[])
{
    int v,w,k,min;
    int final[MAXVEX];
    for(v=0;v<g.numVertexes;v++)
    {
        final[v]=0;
        s[v]=g.arc[v0][v];
        p[v]=0;
    }
    s[v0]=0;
    final[v0]=1;

    for(v=1;v<g.numVertexes;v++)
    {
        min = INFINITY;
        for(w=0;w<g.numVertexes;w++)
        {
            if(!final[w]&&s[w]<min)
            {
                k=w;
                min=s[w];
            }
        }
        final[k]=1;
        for(w=0;w<g.numVertexes;w++)
        {
            if(!final[w]&&(min+g.arc[k][w]<s[w]))
            {
                s[w] = min+g.arc[k][w];
                p[w] = k;
            }
        }
    }
}


int main()
{
    MGraph g;
    int i,v0=0;
    int patharc[MAXVEX],shortPath[MAXVEX];
    createMGraph(&g);
    shortPathDijkstra(g,v0,patharc,shortPath);
    for(i=0;i<MAXVEX;i++)
    {
        printf("%d,%d\n",patharc[i],shortPath[i]);
    }
}
posted @ 2014-03-02 19:27  越影&逐日而行  阅读(297)  评论(0编辑  收藏  举报