博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dijkstra算法
阅读量:5262 次
发布时间:2019-06-14

本文共 2937 字,大约阅读时间需要 9 分钟。

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

刚刚写了一遍,现在再写一遍,把思路一遍写出。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 
#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
vexs[i]=i; } for(i=0;i
numVertexes;i++) { for(j=0;j
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
numVertexes;i++) { for(j=i;j
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

转载于:https://www.cnblogs.com/fengbing/p/3577174.html

你可能感兴趣的文章
html标签的嵌套规则
查看>>
[Source] Machine Learning Gathering/Surveys
查看>>
HTML <select> 标签
查看>>
类加载机制
查看>>
tju 1782. The jackpot
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
bzoj3224 splay板子
查看>>
程序存储问题
查看>>
Mac版OBS设置详解
查看>>
优雅地书写回调——Promise
查看>>
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
Ubuntu下面安装eclipse for c++
查看>>
让IE浏览器支持CSS3圆角属性的方法
查看>>