您的位置:首页 > 其它

Dijkstra算法

2014-03-02 19:27 190 查看
求最短路径,这个算法没有什么特别的,对于算法入门,这个算法要熟练的写出来。

刚刚写了一遍,现在再写一遍,把思路一遍写出。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]);
}
}


.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: