这个算法和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)
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>>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<