迪杰斯特拉算法
从全体推到局部,再由局部推出整体
这是一个求最短路径的算法
如图,可以根据这个图求到任一点的最短路径
要实现这个算法,我们需要三个最主要的数组
1.S数组:记录目标顶点(也就是开始的点但他会更新)到其他顶点的最短路径是否求得
2.P数组:记录目标顶点到其他顶点的最短路径的前驱节点(假如说1到5是最短路径那么7就是他的前驱节点)
3.D数组:记录目标顶点到其他顶点最短路径的长度(如果不能直接到达,那记作正无穷)
看一下刚开始的初值
思路:整体的一个思路我认为是像背包一样,用到了贪心的思想
(就是先找局部最优解,再找全局最优解)
以这道题为例子吧,
他是想找1到4的最短路径,如果想完成这个目的,那就要先找到一到三和五的最短路径,依次往前推......
(这是我对于dijkstra算法的简单理解)
那下面就是对于算法的代码实现了
#include<stdio.h>
#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;i<n;i++)
{
//用min记录最小len[i]
int min=INF;
//记录小len[i]的点
for(j=1;j<=n;j++)
{
if(visit[j]==0&&min>len[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;
}
加油!!!上面就是所有的代码了