这个算法和Dijkstra算法的区别在于;Dijkstra算法适用于大图,它能够指定到达某个点即停止计算;而这个算法则一般不能用于大图(时间过长),因为它必然是n的2次方次运算。
两个算法都是计算某一个点到其他各点的最短通路
弗洛伊德算法则是计算所有顶点对之间最短通路的长度
//弗洛伊德变种算法计算最短通路(更改,使其计算v0点到各点的最短通路)
// procedure Floyd(G:带权简单图)
// {G有顶点v1.v2....vn和权}
// for i= 1 to n
// for k= 1 to n
// if d(v0,vi)+d(vi,vk)<d(v0,vk)
// then d(v0,vk) = d(v0,vi)+d(vi,vk)
// d(v0,vj)是在vi到vj之间的最短通路
//使用了huilu数组存放这个点的前一个合理点;
//while( no_s(v-1,s) )//当所求的点不在s中,这语句严格来说是求点(v-1)这个点到始点的路径
//for(i=0;i<v;++i)//这条语句能求所有点的最短路径
/*
粘贴输入下列
4 4
0 1 1
0 3 8
0 2 3
2 3 4
、、、、、、、、、、、、、、、、、、、、、、
6 9
0 1 4
0 2 2
1 2 1
1 3 5
2 3 8
2 4 10
3 4 2
3 5 6
4 5 3
32767 4 2 32767 32767 32767
4 32767 1 5 32767 32767
2 1 32767 8 10 32767
32767 5 8 32767 2 6
32767 32767 10 2 32767 3
32767 32767 32767 6 3 32767
0
021
02
0213
02134
021345
Press any key to continue
*/
#include <iostream>
using namespace std;
//012345分别表示v0 v1......
int v;//////点数目
int edge;///边数目
int si=0;//si用来控制s数组的位置
int** draw();//绘图
void digui_shuchu(int k,int *huilu);//递归输出
int main(int argc, char const *argv[])
{
int i;
int**a=draw();
//------------------------------------------------------------------------//
int* l=new int[v];//存放i点到0点的路径长度
for ( i = 0; i < v; ++i)l[i]=32767;
//------------------------------------------------------------------------//
int* huilu=new int[v];//存放i点的前一个合理点
for ( i = 0; i < v; ++i)huilu[i]=-1;
//------------------------------------------------------------------------//
l[0]=0;
int u;
huilu[0]=0;
//------------------------------------------------------------------------//
for ( u = 0; u < v; ++u)
{
for ( i = 0; i < v; ++i)
{
if (l[u]+a[u][i] < l[i])//lenth和路径将会改变
{/////////////////////////////////////////更换i的所有数据
l[i]=l[u]+a[u][i];
huilu[i]=u;
}
}
}
//------------------------------------------------------------------------//
for(int f=0;f<v;++f)
{
cout<<"0";
digui_shuchu(f,huilu);
cout<<"\n";
}
return 0;
}
int** draw()//绘图
{
int i,j;
cin>>v>>edge;///输入点数目和边数目
int **a=new int*[v];
for ( i = 0; i < v; ++i)
a[i]=new int[v];
for ( i = 0; i < v; ++i)
for ( j = 0; j < v; ++j)
a[i][j]=32767;
int spot1,spot2,len;
for ( i = 0; i < edge; ++i)
{
cin>>spot1>>spot2>>len;
a[spot1][spot2]=len; a[spot2][spot1]=len;
}
///-------------------------------------------------------------///
for ( i = 0; i < v; ++i){
for ( j = 0; j < v; ++j)
cout<<a[i][j]<<" ";
cout<<"\n";
}
cout<<"\n";
return a;
}
void digui_shuchu(int k,int *huilu)
{
if (k!=0)
{
digui_shuchu(huilu[k],huilu);
cout<<k;
}
else return;
}
弗洛伊德变种算法计算最短路径