这个算法和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; }
原文:http://blog.csdn.net/h1023417614/article/details/18794765