C语言实现dijkstra算法(基础版)

迪杰斯特拉算法

从全体推到局部,再由局部推出整体

这是一个求最短路径的算法

C语言实现dijkstra算法(基础版)_第1张图片

如图,可以根据这个图求到任一点的最短路径

要实现这个算法,我们需要三个最主要的数组

1.S数组:记录目标顶点(也就是开始的点但他会更新)到其他顶点的最短路径是否求得

2.P数组:记录目标顶点到其他顶点的最短路径的前驱节点(假如说1到5是最短路径那么7就是他的前驱节点)

3.D数组:记录目标顶点到其他顶点最短路径的长度(如果不能直接到达,那记作正无穷)

看一下刚开始的初值

C语言实现dijkstra算法(基础版)_第2张图片

思路:整体的一个思路我认为是像背包一样,用到了贪心的思想

(就是先找局部最优解,再找全局最优解)

以这道题为例子吧,

他是想找1到4的最短路径,如果想完成这个目的,那就要先找到一到三和五的最短路径,依次往前推......

(这是我对于dijkstra算法的简单理解)

那下面就是对于算法的代码实现了

#include
#define SIZE 110
#define INF 1000000
//全局变量默认初始化为0,所以不用初始化
int map[SIZE][SIZE];//邻接矩阵储存
int len[SIZE];//d[i]表示源点到i这个点的距离
int visit[SIZE];//节点是否被访问
int n,m,j,pos,ans,temp;
temp=INF;
int dijkstra(int from,int to)
{
    int i;
    //初始化
    for(i=1;i<=n;i++)
    {
        //一开始每个点都没被访问
        visit[i]=0;
        //先假设源点到其他点的距离
        len[i]=map[from][i];   
    }
    //对除源点的每一个点进行最短计算
    for(i=1;ilen[j])
             {
                 pos=j;
                 min=len[j];             
             }           
        }
        visit[pos]=1;
        for(j=1;j<=n;j++)
        {
            if(visit[j]==0&&(len[j]>(len[pos]+map[pos][j])))
            {
                //如果j节点没有被访问过且j节点到源节点的最短距离>pos节点到源节点的最短路径+pos节点到j节点的路径
                len[j]=len[pos]+map[pos][j];                            
            }        
        }                            
    }
    return len[to];
}
int main (void)
{
    int i;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            map[i][j]=INF;        
        }    
    }
    int a,b,c;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        map[a][b]=map[b][a]=c;    
    }
    printf("%d",ans=dijkstra(3,6));
    return 0;
}

加油!!!上面就是所有的代码了

你可能感兴趣的:(算法,c语言,开发语言)