寻路算法A*和Dijkstra

网上找了很多A*和Dijkstra算法的解析,很多都很难理解,下面这两篇非常清晰。
A*算法http://blog.csdn.net/zgwangbo/article/details/52078338
Dijkstra(迪杰斯特拉)算法http://blog.csdn.net/mu399/article/details/50903876

/************************************************************************* > File Name: Dijkstra.cpp > Author: > Mail: > Created Time: 2017年07月05日 星期三 20时21分59秒 ************************************************************************/
#define MAX 256
#include<iostream>
#include<limits.h>
using namespace std;
typedef struct graph
{
    char vex[MAX];
    int vexnum;
    int edgnum;
    int matrix[MAX][MAX];
}Graph,*PGraph;
typedef struct EdgeData
{
    char start;
    char end;
    int weight;
}EData;
void dijkstra(Graph G,int vs,int prev[],int dist[])
{
    int i,j,k;
    int min;
    int flag[MAX];
    //初始化
    for(i=0;i<G.vexnum;i++)
    {
        flag[i]=0;  //顶点i是否获取到最短路径
        prev[i]=0;  //顶点i的前驱顶点
        dist[i]=G.matrix[vs][i]; //顶点i的最短路径为vs到i的权
    }
    flag[vs]=1;
    dist[vs]=0;
    //遍历所有顶点(起点除外)
    for(i=1;i<G.vexnum;i++)
    {
        //在未获取最短路径的集合中,寻找权最低的顶点k
        min=INT_MAX;
        for(j=0;j<G.vexnum;j++)
        {
            if(flag[j]==0&&dist[j]<min)
            {
                min=dist[j];
                k=j;
            }
        }
        flag[k]=1;
        //修正当前最短路径和前驱顶点
        for(j=0;j<G.vexnum;j++)
        {
            int tmp=(G.matrix[k][j]==INT_MAX?INT_MAX:(min+G.matrix[k][j]));
            if(flag[j]==0&&(tmp<dist[j]))
            {
                dist[j]=tmp;
                prev[j]=k;
            }
        }
    }
    // 打印dijkstra最短路径的结果
    printf("dijkstra(%c): \n", G.vexs[vs]);
    for (i = 0; i < G.vexnum; i++)
        printf(" shortest(%c, %c)=%d\n", G.vexs[vs], G.vexs[i], dist[i]);

}
    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/lqygame/article/details/74502704
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞