Floyd
计算每一对顶点间的最短路径。
需用邻接矩阵存储。
采用动态规划的原理处理,通过考虑最佳子路径来得到最佳路径。
算法原理:动态规划。
时间复杂度:O(n^3)。
算法思想
设disi,j,k为从i到j的以{1,…,k}集合中的结点为中间节点的最短路径的长度。
1、若最短路径经过点k,则disi,j,k=disi,k,k−1+disk,j,k−1;
2、若最短路不经过点k,则disi,j,k=disi,j,k−1
则,disi,j,k=min(disi,j,k−1,disi,k,k−1+disk,j,k−1);
在实际算法中,为了节约空间,可直接在原来空间上进行迭代,是空间降至二维。
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
Code
int n;
int g[NUM][NUM];
int dis[NUM][NUM];
int pre[NUM][NUM];
void Floyd()
{
memset(dis,INF,sizeof(dis));
memset(pre,-1,sizeof(pre));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(i==j)
{
dis[i][i]=0;
pre[i][i]=0;
}
else
{
dis[i][j]=g[i][j];
pre[i][j]=i;
}
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(dis[i][j]>dis[i][k]+dis[k][j])
{
dis[i][j]=dis[i][k]+dis[k][j];
pre[i][j]=pre[k][j];
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。