网上找了很多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]);
}