弗洛伊德算法的基本思想 弗洛伊德算法流程图
floyd算法 是动态规划的思想吗
1.定义概览
弗洛伊德算法的基本思想 弗洛伊德算法流程图
弗洛伊德算法的基本思想 弗洛伊德算法流程图
弗洛伊德算法的基本思想 弗洛伊德算法流程图
Floyd-Warshall算法(Floyd-Warshall
algorithm)是解决任意两点间的短路径的一种算法,可以正确处理有向图或负权的短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。
2.算法描述
1)算法思想原理:
Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划富创造力的精华所在)
从任意i到任意j的短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个k到j。所以,我们设Dis(i,j)为u到v的短路径的距离,对于每一个k,我们检查Dis(i,k)
+Dis(k,j)
=Dis(i,k) +Dis(k,j),这样一来,当我们遍历完所有k,Dis(i,j)中记录的便是i到j的短路径的距离。 2).算法描述: a.从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。 b.对于每一对顶... 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的短路径的一种算法,可以正确处理有向图或负权的短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。 2.算法描述 1)算法思想原理: Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划富创造力的精华所在) 从任意i到任意j的短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个k到j。所以,我们设Dis(i,j)为u到v的短路径的距离,对于每一个k,我们检查Dis(i,k) +Dis(k,j) =Dis(i,k) +Dis(k,j),这样一来,当我们遍历完所有k,Dis(i,j)中记录的便是i到j的短路径的距离。 2).算法描述: a.从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。 b.对于每一对顶点 u和 v,看看是否存在一个顶点 w使得从 u到 w再到 v比己知的路径更短。如果是更新它。 3).Floyd算法过程矩阵的计算----十字交叉法 方法:两条线,从左上角开始计算一直到右下角 如下所示 给出矩阵,其中矩阵A是邻接矩阵,而矩阵Path记录u,v两点之间短路径所必须经过的点 每一对顶点之间的短路径是指对于给定的带权有向图G=(v,E),要对G中任意一对顶点有序对(vi,vj)(vi≠vj),找出vi到vj的短距离和vj到vi的短距离。 解决此问题的一个有效方法是:轮流以每一个顶点为源点,重复执行Dijkstra算法n次,即可求得有向图G=(v,E)中每一对顶点间的短路径,总的时间复杂度为0(n2)。 弗洛伊德(Floyd)提出了另一个求任意两顶点之间短路径的算法,虽然其时间复杂度也是0(n2),但算法形式更为简明,易于理解与编程。 1.弗洛伊德算法的思想弗洛伊德算法是从图的邻接矩阵开始,按照顶点v0,v1,v2,v2,…,vn的次序,分别以每个顶点vk(0≤k<n)作为新考虑的中间点,在第k-1次运算D(k-1)的基础上,求出每一对顶点之间vi到vj的短路径长度D(k)[i][j],计算公式为: D(k)[i][j]=min{D(k-1)[i][j],D(k-1)[i][k]+D(k-1)[k][j]}重复执行n次后,D(k)[i][j]中保留的值就是每对顶点的vi到vj的短路径长度。 2.弗洛伊德算法的步骤(1)从图的带权邻接矩阵G.arcs[][]开始,即D(-1)=arcs[][],每次以上一次D(k-1)为基础,用公式D(k)[i][j]=min{D(k-1)[i][j],D(k-1)[i][k]+D(k-1)[k][j]}计算出D(k)[i][j]的值,即D(k-1)[i][k]+D(k-1)[k][j]<D(k-1)[i][j]才修改,若D(k)[i][j]修改过,则相应的路径P(k)[i][j]也要作相应的修改,即P(k)[i][j]=P(k-1)[i][k]+P(k-1)[k][j]。 (2)重复上述过程n次后,D(k)[i][j]中保存的就是每一对顶点的短路径长度,P(k)[i][j]中保存的就是每一对顶点的短路径。 说明:从计算公式可以看出,i=j是对角线上的元素;i=k是i行上的元素;j=k是j列上的元素,这些特殊的顶点不用计算,保留原来的数据值。因此,计算的数据元素减少了很多。 floyd算法用以解决所有点对短路径。 floyd算法基本思想是递推,动态规划。我们记 dp[j][k] 表示图中顶点 i 到 j 的短路径,且该短路径中,所经过的中间顶点(不包括 i, j) 的范围为 [1,k],由此我们可以得到以下递推式: dp[j][k]= w[j] 如果 k== 0 dp[j][k]= min{ dp[k][k-1]+ dp[k][j][k-1] } 如果 k>= 1。 实际中,空间上我们可以减少一维。 floyd算法同样可以来解决一些其它问题 1) 有向图的小(或)环 这个问题其实就是自身到自身的短路径,运行完 floyd 后,对每个顶点取自身到自身距离的小者。 2) 无向图的小环 根据以上的递推式,dp[j][k] 表示 i 到 j 的短路径,且该短路径中,所经过的中间顶点(不包括 i, j) 的范围为 [1,k]。 此时我们可以枚举出顶点序列为 k+ 1 的所有小环,如何枚举:设与顶点序列的顶点 k+ 1 相连的两个顶点为 x, y,x,y 须满足 x, y<= k。这样小环构成为 边 Poj 1734 Sightseeing trip #include #include int const N= 110, inf= 5000000; int mat[N][N], dist[N][N], pre[N][N], path[N], n, m, top= 0, p; #define min(a,b) ((a)<(b)?(a):(b)) int main(){ scanf("%d%d",&n,&m ); for( int i= 0; i<= n; ++i ) for( int j= 0; j<= n; ++j ){ mat[j]= inf; dist[j]= inf; pre[j]= j; } while( m-- ){ int u, v, d; scanf("%d%d%d",&u,&v,&d); mat[v]= min( mat[v], d ); mat[v]= mat[v]; dist[v]= mat[v]; dist[v]= mat[v]; }int ans= inf; for( int k= 1; k<= n; ++k ){ for( int x= 1; x< k; ++x ) for( int y= 1; y< x; ++y ){ if( mat[x][k]+ mat[k][y]+ dist[x][y]< ans ){ ans= mat[x][k]+ mat[k][y]+ dist[x][y]; top= 0; path[top++]= k; p= x; while( p!= y ){ path[top++]= p; p= pre[p][y]; }path[top++]= y; }} for( int i= 1; i<= n; ++i ) for( int j= 1; j<= n; ++j ) if( dist[k]+ dist[k][j]< dist[j] ){ dist[j]= dist[k]+ dist[k][j]; pre[j]= pre[k]; } }if( top> 0 ){ printf("%d", path[0] ); for( int i= 1; i< top; ++i ) printf(" %d", path ); puts(""); }else puts("No solution."); return 0; } floyd算法思想:1,构建一个邻接矩阵存储任意两点之间的权值如图D0. 2、例如求v1,v4之间的短路径。先增加v2做中间顶点,D[1][4]=∞。if(D[1][4]>D[1][2]+D[2]4])=6+4)D[1][4]=10;这样就可以了。 3、如不能在离得较远的两点(例v1,v9)直接得到上述可以满足if的中间点,则跟据你书本的代码可以先构建原点到中间点的短路径,继而就可以求得vi,v9之间的短路径 20世纪上半叶,佛洛伊德的观点是解释人类心智运作主要的理论。佛洛伊德的基本主张指出:人类的动机大都隐藏在无意识的心智,而且还备受压抑,而无法进入意识。执行心智的机器(自我),会排斥任何可能激起不符合自身有关文明人所应有行为的无意识驱力(本我,id)。这种压抑是必要的,因为驱力会以脱缰的热情、幼稚的幻想,以及与攻击欲的方式表现出来。每一对顶点之间的短路径是什么?
跪求 弗洛伊德算法 一个错误的解释:
求弗洛伊德算法的详细解释~
佛洛伊德的理论是什么?
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。