这两天,刘老师给我们大致讲了一下有关图论的知识。老师真的是一波操作猛如虎,下面是学生懵逼眼迷离......还好,我大致都听懂了,也只是有点小懵......回头我研究了两三个小时的迪杰特斯拉算法,终于研究出了一套规律,彻彻底底搞懂了我迪哥博大精深的思维,下面我就详细讲解一下。
首先附上代码和注释
int dis[500] ;//start到i的最短距离
int a[500][500]; //矩阵
bool f[500];//两个集合
int n;//n个点
int k;//记录最小的编号;
void dijkstra(int st)//st表示最初的点
for(int ii=1;ii<=n;ii++)
{
d[ii]=a[st][ii];//输入矩阵之前来一个memset(a,10,sizeof(10))使得没有路径的两个点距离很大
}
memset(f,false,sizeof(f));//初始状态 表示都没访问过
f[st]=true;
d[st]=0;
for(inti=1;i<=n;i++)
{
int min=10000000;
k=0;
for(intj=1;j<=n;j++)
{
if(!f[j]&&(d[j]<min))
{
min=d[j];//
k=j;//找到最小的距离和对应的节点
}
}
if(k==0)
return ;//已经找不到了
f[k]=true;//把k加入集合1
for(int l=1;l<=n;l++)//三角形迭代,更新最短距离
{
if(!f[l]&&(d[k]+a[k][l]<d[l]))
{
d[l]=d[k]+d[k][l];//如果没有访问过而且符合三角形迭代就更新
}
}
}
详细注释
一. 定义
二. 将所有点到start的距离搞到一个数组里
三. 将所有点搞成初始状态(即都是false)
四. 将start变为真且将start到start的距离改为0
五. 开始一个大循环(即关键部分)
1. 定义后进入一个小循环,找到假的部分中离start最近的点和这个点的位置
2. 进入一个判定:如果k==0,说明已经没有点了,结束整个函数;
如果k不等于0,继续。
3. 把k变为真后进入最重要的循环,进行三角形迭代并更新最短距离。
看完估计连傻子都能懂,接着附上伪代码:
int dis[500] ;//start到i的最短距离
int a[500][500]; //矩阵
bool f[500];//两个集合
int n;//n个点
int k;//记录最小的编号;
void dijkstra(int st)//st表示最初的点
{
for(int ii=1;ii<=n;ii++)
{
d[ii]=a[st][ii];//输入矩阵之前来一个memset(a,10,sizeof(10))使得没有路径的两个点距离无限大
}
memset(f,false,sizeof(f));//初始状态 表示都没访问过
f[st]=true;
d[st]=0;
for(int i=1;i<=n;i++)
{
int min=10000000;
k=0;
for(int j=1;j<=n;j++)
{
if(!f[j]&&(d[j]<min))
{
min=d[j];//
k=j;//找到最小的距离和对应的节点
}
}
if(k==0)
return ;//已经找不到了
f[k]=true;//把k加入集合1
for(int l=1;l<=n;l++)//三角形迭代,更新最短距离
{
if(!f[l]&&(d[k]+a[k][l]<d[l]))
{
d[l]=d[k]+a[k][l];//如果没有访问过而且符合三角形迭代就更新
}
}
}
}